【发布时间】:2023-03-24 04:45:01
【问题描述】:
解决方案
参考下面我的回答:issues with form/iframe based file upload in Opera
每当浏览器不支持 XMLHttpRequest 上传 (Opera) 时,我都会使用表单/iframe 技术将文件发送到服务器。在高层次上,这是设置...
- 创建一个 iframe
<iframe src="javascript:false;" name="file-iframe"></iframe> - 创建一个表单
<form enctype="multipart/form-data" method="POST">- 设置目标 = iframe 的名称,
target="file-iframe" - 设置操作 = 网址,
action="/upload"
- 设置目标 = iframe 的名称,
- 将文件输入添加到表单中
- 提交表格
表单提交时,服务器吐出异常:
org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
at org.apache.commons.fileupload.MultipartStream.readHeaders(MultipartStream.java:538)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:999)
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:965)
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
at org.apache.commons.fileupload.servlet.ServletFileUpload.getItemIterator(ServletFileUpload.java:148)
at com.beamit.jetty.UploadServlet.doPost(UploadServlet.java:28)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
...
...
这是UploadServlet.java文件中的代码sn-p,失败发生在sn-p的最后一行:
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
ServletFileUpload up = new ServletFileUpload();
try {
FileItemIterator iter = up.getItemIterator(request); // <------ ERROR
...
} catch (IOException e) {
e.printStackTrace();
}
...
我已经尝试调试了好几个小时,但我一无所获。关于为什么会发生这种情况的任何想法?
我可以使用不同的浏览器为工作/非工作文件上传提供 HTTP 请求,如果需要,还可以提供更多源代码。
更多信息
Chrome 中对简单“hello world”文本文件的 HTTP 请求。
POST /upload/0145c HTTP/1.1
Host: beamit:8080
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Referer: http://beamit:8080/
Content-Length: 44
Origin: http://beamit:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryQes3eWoFE2iw6kGE
Opera 中对简单“hello world”文本文件的 HTTP 请求。
POST /upload/f889b HTTP/1.1
User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.7.2; U; en) Presto/2.9.168 Version/11.52
Host: beamit:8080
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en,en-US;q=0.9,ja;q=0.8,fr;q=0.7,de;q=0.6,es;q=0.5,it;q=0.4,pt;q=0.3,pt-PT;q=0.2,nl;q=0.1,sv;q=0.1,nb;q=0.1,da;q=0.1,fi;q=0.1,ru;q=0.1,pl;q=0.1,zh-CN;q=0.1,zh-TW;q=0.1,ko;q=0.1,ar;q=0.1,cs;q=0.1,hu;q=0.1,tr;q=0.1
Accept-Encoding: gzip, deflate
Referer: http://beamit:8080/
Cookie: __utma=248039316.1622718495.1317335167.1319648741.1319655028.19; __utmb=248039316.4.10.1319655028; __utmc=248039316; __utmz=248039316.1317335167.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection: Keep-Alive
Content-Length: 76
Content-Type: multipart/form-data; boundary=----------cah2BDOhbumylzxVY398ZJ
【问题讨论】:
标签: java file-upload apache-commons