javascript中的多部分表单数据与使用FileUpload的java服务器

javascript中的多部分表单数据与使用FileUpload的java服务器,java,file-upload,multipartform-data,apache-commons-fileupload,Java,File Upload,Multipartform Data,Apache Commons Fileupload,我尝试只使用javascript发送包含文件的多部分表单数据。我自己写请求。因此,我的javascript代码如下所示: var data = '------------f8n51w2QYCsvNftihodgfJ\n' + 'Content-Disposition: form-data; name="upload-id"\n' + '\n' + 'uploadedFiles\n' + '------------f8n51w2QYCsvNftihodgfJ

我尝试只使用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);
我在Firefox18上运行这个javascript。 所以我在
/upload
上得到了一个servlet。代码如下:

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
    }
}
我只是不知道为什么我会有这个例外。。。有什么想法吗

似乎
MultipartStream
找不到请求头。但是如果我记录标题,它们都在这里,它们是正确的

我的servlet代码使用“正常”形式。我试着用一个普通表单记录请求主体和头,它们是相同的(当然除了边界)


我还试图用无效内容更改
数据
变量。错误仍然是一样的,因此我的头肯定有问题,但我看不出有什么问题。

我不明白为什么要使用
sendAsBinary
。如果不是绝对必要,我不会自己组装负载(
data
变量),而是使用
FormData

var myform=new FormData();
myform.append(“用户名”、“Groucho”);
myform.append(“accountnum”,123456);//数字123456立即转换为字符串“123456”
//HTML文件输入用户的选择。。。
myform.append(“userfile”,fileInputElement.files[0]);
//JavaScript类文件对象。。。
变量oFileBody='hey!';//新文件的正文。。。
var oBlob=newblob([oFileBody],{type:“text/xml”});
附加(“webmasterfile”,oBlob);
var oReq=新的XMLHttpRequest();
开放式(“POST”http://foo.com/submitform.php");
oReq.发送(myForm);

尝试将f8n51w2QYCsvNftihodgfJ更改为f8n51w2QYCsvNftihodgfM

我试过用不同的随机边界运行代码,结果只发现f8n51w2QYCsvNftihodgfJ\n出现了问题。我想你可以尝试不同的边界,因为它实际上只是一个随机字符串。

我找到了解决方案


\n
不是多部分表单的有效分隔符。您必须使用
\r\n
。现在我的代码工作正常。

如果没有使用JavaScript(例如使用Firebug)伪造浏览器发送的实际POST请求,您是否尝试过将其记录下来,并将其与您的“数据”变量进行比较?是的,我已经尝试过了。请求主体和头是相同的(当然,除了边界)。我还尝试记录JumpLoader(一个java小程序)生成的请求。
sendAsBinary
只是一次尝试。我在发送时遇到了同样的问题。但我不想使用文件输入。我不能在Firefox上使用Blob,因为有Firefox的“选择”(或者bug,我不知道)。文件名总是“blob”,我不想要它。
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)
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);