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());
|
}
|
|
/**
|
* 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 <input type="file" name="..." />
|
* @param uploadFile a File to be uploaded
|
* @throws IOException
|
*/
|
public void addFilePart(String fieldName, File uploadFile)
|
throws IOException {
|
String 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 = Files.readAllBytes(uploadFile.toPath());
|
byte[] bytes = FileUtils.readFileToByteArray(uploadFile);
|
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();
|
if (status == HttpURLConnection.HTTP_OK || status == HttpURLConnection.HTTP_CREATED) {
|
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;
|
}
|
}
|