我正在尝试使用HTTPHandler上传文件(多部分表单数据).
WebKit Boundary正在写入目标文件,从而破坏文件.
输入文件可以是任何类型的文件,包括文本,zip,apk等.
码:
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 queryParams = queryToMap(httpExchange.getRequestURI().getQuery());
Set keys= headers.keySet();
Iterator 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();
}
}
}
}
这是HTML代码
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;
}
Please specify a file, or a set of files:
这里出了什么问题?
非常感谢帮助.
编辑1:
如果输入文件是包含文本的文本文件:1234567890
输出文件包含内容:
------WebKitFormBoundaryKBRUiUWrIpW9wq2j
Content-Disposition: form-data; name="textline"
------WebKitFormBoundaryKBRUiUWrIpW9wq2j
Content-Disposition: form-data; name="datafile"; filename="test.txt"
Content-Type: text/plain
1234567890
------WebKitFormBoundaryKBRUiUWrIpW9wq2j--