我正在使用Spring的CommonsMultipartResolver
来处理servlet 3环境中的文件上传。
如果上传的文件很大,一切正常。
如果上传的文件较小,则解析程序无法发现任何部分(不会抛出异常)。
尽管帖子中有多个有效部分,但我已将apache.commons.fileupload.FileItemIteratorImpl
方法返回到findNextItem()
跟踪到MultipartFile
。这导致我的控制器方法无法使用HttpServletRequest
对象。
当我在getParts()
查看调试器时,我看到正确的部件数量(HttpServletRequest
会返回正确数量的部件)。
我可以使用CommonsMultipartResolver
,但对于大文件(> 1MB),会抛出有关最大文件大小的异常(我已成功为HttpServletRequest
配置但显然是不要越过commons-fileupload
)。
我查看了尝试配置Servlet 3的最大文件大小,但我不想在我的应用程序中添加几个新类来设置该大小。
有没有办法使用Servlet 3和commons-fileupload
上传较小的文件?
更多
我已将maxUploadSizePerFile
配置为commons-fileupload
= 100MB。
以下行为导致:
如果上传的文件是> 10MB,然后commons-fileupload
处理它,一切都很好。
如果上传的文件介于~3.8 MB和10 MB之间,则在commons-fileupload
有机会解析导致浏览器中的连接重置消息的请求之前,输入流和底层连接都将关闭。 / p>
对于介于1 MB和~3.8 MB之间的上传文件,输入流将关闭,但不会关闭基础连接,从而允许我的错误页面显示错误。
最后,如果上传的文件小于1 MB,则基础servlet 3实现会在commons-fileupload
被调用之前成功处理部分,使Any(result => result > 1)
认为请求中没有部分。
答案 0 :(得分:0)
使用Spring Boot导致此行为(以前我不知道)会自动为Servlet 3配置多部分。这会导致基础JRE
在HttpServletRequest
有机会之前处理文件上载它
在这一点上我唯一感到好奇的是,如果上传的文件足够大,它就不会失败。
答案 1 :(得分:0)
是的,这完全是由于弹簧靴跳跳并试图帮助您而造成的,在这种情况下会引起问题。以下是修复此问题的步骤:
将CommonsMultipartResolver配置为一个Bean(很有可能已经做到了):
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
在application.properties文件中禁用spring servlet的多部分处理
spring.servlet.multipart.enabled=false
然后以极大的热情欢欣鼓舞。