JavaScriptのみを使用して、マルチパートフォームデータをファイルで送信しようとしています。リクエストは自分で書きます。したがって、私のJavaScriptコードは次のとおりです。
var data =
'------------f8n51w2QYCsvNftihodgfJ\n' +
'Content-Disposition: form-data; name="upload-id"\n' +
'\n' +
'uploadedFiles\n' +
'------------f8n51w2QYCsvNftihodgfJ\n' +
'Content-Disposition: form-data; name="file"; filename="doc1.txt"\n' +
'Content-Type: text/plain\n' +
'\n' +
'azerty\n' +
'------------f8n51w2QYCsvNftihodgfJ--\n';
var xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=----------f8n51w2QYCsvNftihodgfJ');
xhr.sendAsBinary(data);
私はFirefox 18でこのJavaScriptを実行しています/upload
。コードは次のとおりです。
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestContext request_context = new ServletRequestContext(request);
boolean is_multipart = ServletFileUpload.isMultipartContent(request_context);
if (is_multipart) {
FileUpload file_upload = new FileUpload(fileItemFactory);
List<FileItem> file_items = file_upload.parseRequest(request_context); // This line crash
}
}
コメントにあるように、行がfile_upload.parseRequest(request_context);
クラッシュし、次の例外がスローされます。
org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
at org.apache.commons.fileupload.MultipartStream.readHeaders(MultipartStream.java:539)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:976)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:942)
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:349)
そして、なぜこの例外が発生したのかわかりません...何か考えはありますか?
MultipartStream
リクエストヘッダーが見つからないようです。しかし、ヘッダーをログに記録すると、それらはすべてここにあり、正しいものです。
私のサーブレット コードは「通常の」形式で動作します。通常のフォームのリクエストボディとヘッダーをログに記録しようとしましたが、それらは同じです (もちろん、境界を除いて)。
data
また、無効な内容で変数を変更しようとしました。エラーはまだ同じなので、ヘッダーに問題があることは明らかですが、何がわかりません。