我正在尝试使用FileReference类上传文件。文件> 2MB都正常工作但文件<2MB导致此错误:
“java.io.IOException:损坏的表单数据:过早结束”
在服务器上,我使用com.oreilly.servlet包来处理请求。
我已经多次使用这个包来成功处理flex的文件上传,但由于某种原因,现在我遇到了这个问题。
以下是更多信息的堆栈跟踪:
java.io.IOException: Corrupt form data: premature ending
at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:205)
at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:222)
at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:173)
at com.mydomain.FileUploadServlet.doPost(FileUploadServlet.java:46)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:414)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
http://www.servlets.com/cos/faq.html
为什么在使用com.oreilly.servlet.MultipartRequest或MultipartParser时大型上传失败?这些类本身是专门设计的,没有最大上传大小限制(与大多数其他文件上传实用程序不同),但为了保护服务器,构造函数允许您设置最大的POST大小以接受。任何超过限制的上传都将暂停。默认最大值为1 Meg。有关服务器在通知客户端错误时遇到的困难的讨论,请参阅Java Servlet编程,第2版,第119页中的讨论。
那么,您是否指定了要接受的最大POST大小?
附:好的,现在我看到导致问题的是小上传。在上面的FAQ链接中,有一节专门用于对上传进行故障排除,包括一些帮助隔离原因的方法(客户端,浏览器,Web服务器,库)。试试吧。
安装一个Firefox插件(Tamper Data或Firebug),显示发送给服务器的请求。可以帮助您了解<2M和> 2M上传之间是否有任何不同。
P.P.S.文件结构是否相同?可能是较小的那些具有破坏Flash库的不同数据(例如特殊符号)?例如,尝试仅上传小空间文件。
@Vladimir:
我使用了一个http嗅探器来检查发布请求,它正在发送整个文件,并且发布请求格式是正确的。我已经尝试了许多不同的文件(.jpg,.mp3等)<2MB且没有一个正常工作。
最大帖子大小设置为1.5GB。
以下是帖子请求:
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3
Content-Disposition: form-data; name="Filename"
IMG0001.jpg
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3
Content-Disposition: form-data; name="Filedata"; filename="IMG0001.jpg"
Content-Type: application/octet-stream
<file data here>
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3
Content-Disposition: form-data; name="Upload"
Submit Query
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3--
我已经确认这是服务器端问题,因为我使用常规html表单测试了servlet,并得到了相同的结果。
还有其他想法吗?
这样做的原因是因为请求是使用“Transfer Encoding:chunked”标头发送的,而不是Content-length标头。许多服务器不理解分块内容,也不理解。如果您的请求是使用传输编码标头发送的,请使用嗅探器进行检查。我不知道任何解决方案。
当使用com.orielly.servlet.MultipartRequest类和org.apache.struts2.dispatcher.ActionContextCleanUp过滤器时,似乎存在一个错误。这是导致小文件上传失败的原因。
如果您没有使用结构,那么可以通过从项目库中删除结构库来解决它。