2008-10-27 58 views
0

我試圖使用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) 

更新:

似乎有使用com.orielly.servlet.MultipartRequest時存在錯誤類和org.apache.struts2.dispatcher.ActionContextCleanUp過濾器一起使用。這是導致小文件上傳失敗的原因。

+3

如果你已經找到了自己問題的答案,你應該回答答案並接受它,而不是改變標題。 – SingleNegationElimination 2009-06-15 23:24:40

回答

0

當將com.orielly.servlet.MultipartRequest類和org.apache.struts2.dispatcher.ActionContextCleanUp過濾器一起使用時,似乎存在一個錯誤。這是導致小文件上傳失敗的原因。

+0

你是怎麼修復它的? – user2930137 2017-07-18 14:40:37

0

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

爲什麼使用com.oreilly.servlet.MultipartRequest或MultipartParser什麼時候大上傳失敗? 這些類本身是專門設計爲沒有最大上傳大小限制(與大多數其他文件上傳實用程序不同),但爲了您的服務器保護,構造函數允許您設置最大POST大小以接受。超過限制的任何上傳都將停止。默認最大值是1 Meg。有關服務器將錯誤通知給客戶端的困難的討論,請參閱Java Servlet編程第2版,第119頁中的討論。

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

P.S.好吧,現在我看到它是導致問題的小型上傳。在上面的FAQ鏈接中,有一個專門用於解決上傳問題的部分,其中包括一些用於隔離原因的方法(客戶端,瀏覽器,Web服務器,庫)。試試看。

安裝顯示發送到服務器的請求的Firefox插件(Tamper Data或Firebug)。可以幫助您瞭解< 2M和> 2M上傳之間是否有任何不同。

P.P.S.是相同結構的文件嗎?難道小個子有不同的數據(例如特殊符號)會破壞Flash庫嗎?例如,嘗試僅上傳空間的小文件。

0

@Vladimir:

我已經使用了HTTP嗅探器來檢查POST請求,它是發送整個文件和POST請求的格式是正確的。我已經嘗試了許多不同的文件(.jpg,.mp3等),它們是< 2MB,而且都沒有工作。

最大發布大小設置爲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 

<file data here> 
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3 
Content-Disposition: form-data; name="Upload" 

Submit Query 
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3-- 

我已經確認這是一個服務器端的問題,因爲我有一個普通的HTML表單測試的servlet和我得到相同的結果。

還有其他想法嗎?

0

原因是因爲請求是使用「傳輸編碼:分塊」標題而不是內容長度標題發送的。許多服務器不理解分塊的內容,而o'reilly也不明白。如果您的請求已通過傳輸編碼標頭髮送,請使用嗅探器進行檢查。我不知道任何解決方案。