0

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また、無効な内容で変数を変更しようとしました。エラーはまだ同じなので、ヘッダーに問題があることは明らかですが、何がわかりません。

4

3 に答える 3

2

解決策を見つけました。

\n マルチパート フォームの有効なセパレータではありません。を使用する必要があります\r\n。今私のコードは正しく動作します。

于 2013-02-19T11:22:41.237 に答える
0

を使用する理由がわかりませんsendAsBinary。絶対に必要でない場合は、ペイロード (data変数) を自分でアセンブルせずに使用しますFormData

https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/FormData/Using_FormData_Objects

var oMyForm = new FormData();

oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456); // number 123456 is immediately converted to string "123456"

// HTML file input user's choice...
oMyForm.append("userfile", fileInputElement.files[0]);

// JavaScript file-like object...
var oFileBody = '<a id="a"><b id="b">hey!</b></a>'; // the body of the new file...
var oBlob = new Blob([oFileBody], { type: "text/xml"});

oMyForm.append("webmasterfile", oBlob);

var oReq = new XMLHttpRequest();
oReq.open("POST", "http://foo.com/submitform.php");
oReq.send(oMyForm);
于 2013-02-19T10:39:42.960 に答える
0

f8n51w2QYCsvNftihodgfJf8n51w2QYCsvNftihodgfMに変更してみてください

さまざまなランダム境界でコードを実行しようとしましたが、f8n51w2QYCsvNftihodgfJ\nだけが問題であることがわかりました。実際にはランダムな文字列であるため、別の境界を試すことができると思います。

于 2013-02-19T10:45:12.367 に答える