/** * Takes a bit more work but this technique uses much smaller amounts of RAM. * Additionally, it will work with any size file. For example, I have used * this technique to upload 50GB files using tiny amounts of RAM. Here, we * are uploading a file to the user's personal workspace. */ @SuppressWarnings({"ConvertToTryWithResources", "CallToPrintStackTrace"}) private static void hybridWebSerivceWithHttpPost() throws Exception { final URL wsdl = new URL(props.getProperty("wsdl.Authentication")); System.out.printf("[hybridWebSerivceWithHttpPost] Demonstrate upload using hybrid method to %s.%n", InetAddress.getByName(wsdl.getHost())); final File file = new File(props.getProperty("path.smallToMediumSizeFile")); final byte[] chunk = new byte[1024000]; for (int i = 0; i < chunk.length; i++) { chunk[i] = ((byte)(((int)(Math.random()*26.0))+65)); } int loops = 100; String authToken = getAuthenticationToken(wsdlAuthentication, username, password); OTAuthentication otAuth = getOTAuthentication(authToken); DocumentManagement svcDocMan = getDocumentManagementClient(wsdlDocumentManagement, otAuth); long expire = System.currentTimeMillis() + (1000 * 60 * 5); //get reference to user's personal workspace final com.opentext.livelink.service.docman.Node pw = svcDocMan.getRootNode("PersonalWS"); System.out.printf("[hybridWebSerivceWithHttpPost] [%s] Initialize upload file.%n", sdf.format(new Date())); final OutputStream os = new FileOutputStream(file); for (int i = 0; i < loops; i++) { os.write(chunk); os.flush(); } os.close(); while (true) { if (System.currentTimeMillis() > expire) { System.out.printf("[hybridWebSerivceWithHttpPost] [%s] Refresh web service session.%n", sdf.format(new Date())); authToken = getAuthenticationToken(wsdlAuthentication, username, password); otAuth = getOTAuthentication(authToken); svcDocMan = getDocumentManagementClient(wsdlDocumentManagement, otAuth); expire = System.currentTimeMillis() + (1000 * 60 * 5); } System.out.printf("[hybridWebSerivceWithHttpPost] Upload %sMB file %s%n", (file.length()/(1024000.0)), file.getAbsolutePath()); final String name = String.format("example-document-%s", System.nanoTime()); final String comment = null; //null or empty if no comment. final Metadata meta = null; //null if inheriting categories, etc. final String contextId = svcDocMan.createDocumentContext(pw.getID(), name, comment, Boolean.FALSE, meta); final long contextIdAge = System.currentTimeMillis(); final URL uri = getHttpUrl(authToken, contextId, file.getName(), file.length()); final HttpURLConnection urlCon = (HttpURLConnection) (uri.openConnection()); urlCon.setDoOutput(true); urlCon.setDoInput(true); urlCon.setUseCaches(false); urlCon.setRequestMethod("POST"); urlCon.setRequestProperty("Content-Type", "application/octet-stream"); urlCon.setRequestProperty("Content-Length", String.valueOf(file.length())); urlCon.setFixedLengthStreamingMode(file.length()); urlCon.setReadTimeout(Integer.MAX_VALUE); urlCon.connect(); final InputStream fileStream = new FileInputStream(file); final OutputStream uploadStream = urlCon.getOutputStream(); int bytesRead; long sent = 0; int blocksize = 1024000; final byte[] buffer = new byte[blocksize]; try { int counter = 0; while ((bytesRead = fileStream.read(buffer)) > 0) { sent += bytesRead; uploadStream.write(buffer, 0, bytesRead); uploadStream.flush(); counter++; if (counter % 1 == 0) { System.out.print("."); if (counter % 10 == 0) { System.out.printf("%s %s contextIdAge: %s, sessionAge: %s%n", counter, sent, System.currentTimeMillis() - contextIdAge, System.currentTimeMillis() - (expire - (1000 * 60 * 5))); } } } fileStream.close(); uploadStream.close(); if (urlCon.getResponseCode() == 200) { final InputStream inStream = new BufferedInputStream(urlCon.getInputStream()); final Integer objectId = parseHttpResponse(inStream); inStream.close(); final com.opentext.livelink.service.docman.Node document = svcDocMan.getNode(objectId); System.out.printf("%n[hybridWebSerivceWithHttpPost] Created object %s (%s) using %s.%n", document.getName(), document.getID(), file.getAbsolutePath()); int dataid = document.getID(); System.out.printf("[hybridWebSerivceWithHttpPost] [%s] Delete object %s (%s).%n", sdf.format(new Date()), name, dataid, file.getAbsolutePath()); svcDocMan.deleteNode(dataid); System.out.printf("[hybridWebSerivceWithHttpPost] [%s] Recycle object %s (%s).%n", sdf.format(new Date()), name, dataid, file.getAbsolutePath()); svcDocMan.deleteNode(dataid); } else { System.out.printf("%n[hybridWebSerivceWithHttpPost] Error: %s - %s%n", urlCon.getResponseCode(), urlCon.getResponseMessage()); } } catch (Exception e) { System.out.printf("%n[hybridWebSerivceWithHttpPost] Error: %s%n", e.getLocalizedMessage()); e.printStackTrace(); } System.out.printf("[hybridWebSerivceWithHttpPost] [%s] Swell file.%n", sdf.format(new Date())); final RandomAccessFile raf = new RandomAccessFile(file, "rw"); raf.seek(raf.length()); for (int i = 0; i < loops; i++) { raf.write(chunk); } raf.close(); } } private static URL getHttpUrl(String token, String contextId, String fileName, long fileSize) throws Exception { StringBuilder uri = new StringBuilder(props.getProperty("http.ContentHandler")); uri.append(String.format("?token=%s&contextID=%s", URLEncoder.encode(token, "UTF-8"), contextId)); if (fileName != null) { uri.append(String.format("&fileName=%s&fileSize=%s", fileName, fileSize)); } return new URL(uri.toString()); }