I am trying to upload file (multi part form data) using HTTPHandler.
WebKit Boundary is getting written to the destination file, thus corrupting the file.
Input files can be any kind of files, including text, zip, apk etc.
Code:
public void handle(HttpExchange httpExchange) throws IOException {
URI uri = httpExchange.getRequestURI();
String httpReqMethod = httpExchange.getRequestMethod();
Headers headers = httpExchange.getRequestHeaders();
InputStream inputStrm = null;
FileOutputStream destFile = null;
String contentType = ((headers.get("Content-type") != null) ? (headers.get("Content-type").toString()) : (null));
httpExchange.getRequestURI().getQuery());
Map<String, String> queryParams = queryToMap(httpExchange.getRequestURI().getQuery());
Set<String> keys= headers.keySet();
Iterator<String> itr = keys.iterator();
while(itr.hasNext())
{
String key = (String)itr.next();
}
File file = new File(ACEConstants.WEB_SERVER_CTX_ROOT + uri.getPath()).getCanonicalFile();
String resource = uri.getPath().substring(
uri.getPath().indexOf(ACEConstants.WEB_SERVER_CTX_ROOT)+ACEConstants.WEB_SERVER_CTX_ROOT.length()+1);
if(httpReqMethod.equals(ACEConstants.HTTP_REQUEST_METHOD_POST) )
{
if(contentType != null && contentType.contains("multipart/form-data"))
{
if(resource.equals("fileUpload"))
{
inputStrm = httpExchange.getRequestBody();
destFile = new FileOutputStream(new File("D:\\"+queryParams.get("fileName")));
String contentLength = headers.get("Content-length").toString();
long fileSize = (Long.parseLong(contentLength.substring(1, contentLength.length()-1)));
int iteration = 1;
long bytesToBeRead = (fileSize > 1024) ? ((iteration * 1024)) : (inputStrm.available());
long bytesRemaining = (fileSize) - (iteration * 1024);
byte[] bytes = new byte[1024];
if(fileSize <= 1024)
{
bytes = new byte[inputStrm.available()];
inputStrm.read(bytes);
destFile.write(bytes);
}
else {
while (inputStrm.read(bytes) != -1) {
iteration++;
destFile.write(bytes);
bytesRemaining = ( fileSize - ((iteration-1) * 1024));
if (bytesRemaining >= 1024) {
bytesToBeRead = 1024;
bytes = new byte[1024];
}
else {
bytes = new byte[inputStrm.available()];
inputStrm.read(bytes);
destFile.write(bytes);
break;
}
}
}
destFile.close();
}
}
}
}
Here's the HTML code
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function processForm(frm)
{
var fu1 = document.getElementsByName("datafile");
var filename = fu1[0].value;
filename = filename.substring(filename.lastIndexOf("\\")+1);
alert("You selected " + filename);
frm.action = "http://localhost:64444/ACE/fileUpload?fileName="+filename;
return true;
}
</script>
</head>
<body>
<form name="myForm" enctype="multipart/form-data" method="post" acceptcharset="UTF-8" onsubmit="processForm(this);">
<p>
Please specify a file, or a set of files:<br>
<input type="file" name="datafile" size="40">
</p>
<div>
<input type="submit" value="Send">
</div>
</form>
</body>
</html>
What is going wrong here? Help would be much appreciated.
EDIT 1:
If the input file is a text file containing text : 1234567890
The output file has contents :
------WebKitFormBoundaryKBRUiUWrIpW9wq2j
Content-Disposition: form-data; name="textline"
------WebKitFormBoundaryKBRUiUWrIpW9wq2j
Content-Disposition: form-data; name="datafile"; filename="test.txt"
Content-Type: text/plain
1234567890
------WebKitFormBoundaryKBRUiUWrIpW9wq2j--
How to Upload Files with HttpHandler
File Upload to HttpHandler results in boundary and other MIME information being written into the request contents. As parsing this information is quite comples and error-prone, one could resort to use Commons FileUpload which is proven to work great in classic
Servlet
environments.Consider this example with a custom made
ContextRequest
. This would handle all the parsing of boundaries added into your request body bymultipart/form-data
while still allowing you to keepHttpHandler
interface.The main idea consists of implementing an own version of
ContextRequest
to work with the data provided inHttpHandler
:For reference: Here's a working example listing the received files.
I have faced same issue please use Apache httpClient API for it its best api for connection with URL(file uploading and dealing with multipart form data)