腐败的表格数据:过早结束

我正在尝试使用FileReference类上传文件。 文件> 2MB都正常工作但文件<2MB导致此错误:

“java.io.IOException:损坏的表单数据:过早结束”

在服务器上,我使用com.oreilly.servlet包来处理请求。

我已经多次使用这个包来成功处理flex的文件上传,但由于某种原因,现在我遇到了这个问题。

以下是更多信息的堆栈跟踪:

java.io.IOException: Corrupt form data: premature ending at com.oreilly.servlet.multipart.MultipartParser.(MultipartParser.java:205) at com.oreilly.servlet.MultipartRequest.(MultipartRequest.java:222) at com.oreilly.servlet.MultipartRequest.(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大小?

PS好的,现在我看到它是小的上传导致问题。 在上面的FAQ链接中,有一节专门用于对上传进行故障排除,包括一些帮助隔离原因的方法(客户端,浏览器,Web服务器,库)。 试试吧。

安装一个Firefox插件(Tamper Data或Firebug),显示发送给服务器的请求。 可以帮助您了解<2M和> 2M上传之间是否有任何不同。

PPS是相同结构的文件吗? 可能是较小的那些具有破坏Flash库的不同数据(例如特殊符号)? 例如,尝试仅上传小空间文件。

@Vladimir:

我使用了一个http嗅探器检查发布请求,它正在发送整个文件,并且发布请求格式是正确的。 我尝试了许多不同的文件(.jpg,.mp3等)<2MB,但没有一个正常工作。

最大post大小设置为1.5GB。

以下是post请求:

 ------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3 Content-Disposition: form-data; name="Filename" IMG0001.jpg ------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3 Content-Disposition: form-data; name="Filedata"; filename="IMG0001.jpg" Content-Type: application/octet-stream  ------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3 Content-Disposition: form-data; name="Upload" Submit Query ------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3-- 

我已经确认这是服务器端问题,因为我使用常规html表单测试了servlet,并得到了相同的结果。

还有其他想法吗?

这样做的原因是因为请求是使用“Transfer Encoding:chunked”标头发送的,而不是Content-length标头。 许多服务器不理解分块内容,也不理解o’reilly。 如果您的请求是使用传输编码标头发送的,请使用嗅探器进行检查。 我不知道任何解决方案。

当使用com.orielly.servlet.MultipartRequest类和org.apache.struts2.dispatcher.ActionContextCleanUpfilter时,似乎存在一个错误。 这是导致小文件上传失败的原因。