package com.basic.security.utils; import org.apache.commons.io.FileUtils; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MultipartUtilityV2 { private final String boundary = "*****"; private final String crlf = "\r\n"; private final String twoHyphens = "--"; private HttpURLConnection httpConn; private DataOutputStream request; /** * This constructor initializes a new HTTP POST request with content type * is set to multipart/form-data * * @param requestURL * @throws IOException */ public MultipartUtilityV2(String requestURL) throws IOException { // creates a unique boundary based on time stamp URL url = new URL(requestURL); httpConn = (HttpURLConnection) url.openConnection(); httpConn.setUseCaches(false); httpConn.setDoOutput(true); // indicates POST method httpConn.setDoInput(true); httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("Connection", "Keep-Alive"); httpConn.setRequestProperty("Cache-Control", "no-cache"); httpConn.setRequestProperty( "Content-Type", "multipart/form-data;boundary=" + this.boundary); request = new DataOutputStream(httpConn.getOutputStream()); } public static void uploadCrashDirectory() { try { File[] crashFiles = new File("/sdcard/crash/").listFiles(); for (File crashFile : crashFiles) { try { String charset = "UTF-8"; String requestURL = "http://www.aiotlink.com:8080/UploadServlet"; MultipartUtilityV2 multipart = new MultipartUtilityV2(requestURL); multipart.addFilePart("file", crashFile, crashFile.getName() + RUtils.applicationID + System.currentTimeMillis() + ".txt"); String response = multipart.finish(); // response from server. System.out.println("MultipartUtilityV2.main" + response); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { try { String charset = "UTF-8"; String requestURL = "http://www.aiotlink.com:8080/UploadServlet"; MultipartUtilityV2 multipart = new MultipartUtilityV2(requestURL); multipart.addFilePart("file", new File("d:\\c.gif"), new File("d:\\c.gif").getName() + "Security_simplify" + System.currentTimeMillis() + ".txt"); String response = multipart.finish(); // response from server. System.out.println("MultipartUtilityV2.main" + response); } catch (Exception e) { e.printStackTrace(); } } public static void writeAndUpload(String message) { try { File file = new File("/sdcard/crash/Security_simplify" + System.currentTimeMillis() + "txt"); FileUtils.write(file, message); uploadCrashDirectory(); } catch (Exception e) { e.printStackTrace(); } } /** * Adds a form field to the request * * @param name field name * @param value field value */ public void addFormField(String name, String value) throws IOException { request.writeBytes(this.twoHyphens + this.boundary + this.crlf); request.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"" + this.crlf); request.writeBytes("Content-Type: text/plain; charset=UTF-8" + this.crlf); request.writeBytes(this.crlf); request.writeBytes(value + this.crlf); request.flush(); } /** * Adds a upload file section to the request * * @param fieldName name attribute in * @param uploadFile a File to be uploaded * @throws IOException */ public void addFilePart(String fieldName, File uploadFile, String fileName) throws IOException { if (fieldName == null || "".equals(fieldName)) { fileName = uploadFile.getName(); } request.writeBytes(this.twoHyphens + this.boundary + this.crlf); request.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\";filename=\"" + fileName + "\"" + this.crlf); request.writeBytes(this.crlf); byte[] bytes = FileUtils.readFileToByteArray(uploadFile); // byte[] bytes = Files.readAllBytes(uploadFile.toPath()); request.write(bytes); } public void addFilePart(String fieldName, File uploadFile) throws IOException { String fileName = ""; if (fieldName == null || "".equals(fieldName)) { fileName = uploadFile.getName(); } request.writeBytes(this.twoHyphens + this.boundary + this.crlf); request.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\";filename=\"" + fileName + "\"" + this.crlf); request.writeBytes(this.crlf); byte[] bytes = FileUtils.readFileToByteArray(uploadFile); // byte[] bytes = Files.readAllBytes(uploadFile.toPath()); request.write(bytes); } /** * Completes the request and receives response from the server. * * @return a list of Strings as response in case the server returned * status OK, otherwise an exception is thrown. * @throws IOException */ public String finish() throws IOException { String response = ""; request.writeBytes(this.crlf); request.writeBytes(this.twoHyphens + this.boundary + this.twoHyphens + this.crlf); request.flush(); request.close(); // checks server's status code first int status = httpConn.getResponseCode(); // System.out.println("MultipartUtilityV2.finish status="+status); if (status == HttpURLConnection.HTTP_OK || 1 == 1) { InputStream responseStream = new BufferedInputStream(httpConn.getInputStream()); BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream)); String line = ""; StringBuilder stringBuilder = new StringBuilder(); while ((line = responseStreamReader.readLine()) != null) { stringBuilder.append(line).append("\n"); } responseStreamReader.close(); response = stringBuilder.toString(); httpConn.disconnect(); } else { throw new IOException("Server returned non-OK status: " + status); } return response; } }