【问题标题】:Corrupt form data: premature ending损坏的表单数据:提前结束
【发布时间】:2008-10-27 14:53:06
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • 如果您找到了自己问题的答案,您应该将答案作为答案发布并接受,而不是更改标题。

标签: java actionscript-3 apache-flex


【解决方案1】:

http://www.servlets.com/cos/faq.html

为什么在使用 com.oreilly.servlet.MultipartRequest 或 MultipartParser 时,大型上传会失败? 这些类本身专门设计为没有最大上传大小限制(与大多数其他文件上传实用程序不同),但为了保护您的服务器,构造函数允许您设置最大 POST 大小以接受。任何大于限制的上传都会停止。默认最大值为 1 兆。有关服务器在通知客户端错误时遇到的困难的讨论,请参见 Java Servlet Programming, 2nd Edition, page 119 中的讨论。

那么,您是否指定了要接受的最大 POST 大小?

附:好的,现在我看到是小型上传导致了问题。在上面的常见问题解答链接中,有一个部分专门用于解决上传问题,包括一些有用的方法来隔离原因(客户端、浏览器、Web 服务器、库)。试试看。

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

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

【讨论】:

    【解决方案2】:

    @弗拉基米尔:

    我使用了一个 http 嗅探器来检查 post 请求,它正在发送整个文件并且 post 请求格式是正确的。我尝试了许多

    最大帖子大小设置为 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,并且得到了相同的结果。

    还有其他想法吗?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你是怎么解决的?
        【解决方案5】:

        如果您不使用结构,则可以通过从项目库中删除结构库来解决。

        【讨论】:

          猜你喜欢
          • 2012-05-04
          • 1970-01-01
          • 1970-01-01
          • 2016-10-25
          • 1970-01-01
          • 2018-05-22
          • 2011-04-20
          • 1970-01-01
          相关资源
          最近更新 更多