[英]FileUploadBase does not find any multipart parts when uploading small files
我使用Spring的CommonsMultipartResolver
來處理servlet 3環境中的文件上傳。
如果上傳的文件很大,一切正常。
如果上載的文件較小,則解析程序無法發現任何部分(不會拋出異常)。
我已將此跟蹤到apache.commons.fileupload.FileItemIteratorImpl
,其中findNextItem()
方法返回false,盡管帖子中有多個有效部分。 這導致我的控制器方法沒有可用的MultipartFile
對象。
當我在HttpServletRequest
查看調試器時,我看到正確的部件數量( getParts()
返回正確的部件數量)。
我可以使用HttpServletRequest
,但對於大文件(> 1MB),會拋出一個關於最大文件大小的異常(我已經為CommonsMultipartResolver
成功配置但顯然沒有交叉到HttpServletRequest
)。
我看了一下嘗試配置Servlet 3的最大文件大小,但我不想在我的應用程序中添加幾個新類來設置該大小。
有沒有辦法使用Servlet 3和commons-fileupload
上傳較小的文件?
更多
我有commons-fileupload
配置為maxUploadSizePerFile
= 100MB。
以下行為導致:
如果上傳的文件大於10MB,那么commons-fileupload
處理它,一切都很好。
如果上傳的文件介於~3.8 MB和10 MB之間,則在commons-fileupload
有機會解析導致瀏覽器中的連接重置消息的請求之前,輸入流和底層連接都將關閉。
對於介於1 MB和~3.8 MB之間的上載文件,輸入流將關閉,但不會關閉底層連接,從而允許我的錯誤頁面顯示錯誤。
最后,如果上傳的文件小於1 MB,則底層servlet 3實現在調用commons-fileupload
之前成功處理部件,使commons-fileupload
認為請求中沒有部件。
這種行為是因為使用Spring Boot(以前我不知道)會自動為Servlet 3配置多部分。這會導致底層的HttpServletRequest
在commons-fileupload
有機會之前處理文件上傳。
我在這一點上唯一感到好奇的是,如果上傳的文件足夠大,它就不會失敗。
是的,這完全是由於彈簧靴在路上跳躍並試圖幫助你,這在這種情況下會導致問題。 以下是修復它的步驟:
將CommonsMultipartResolver配置為bean(很可能你已經這樣做了):
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
在application.properties文件中禁用spring servlet multipart處理
spring.servlet.multipart.enabled=false
然后以極大的熱情歡喜快樂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.