Spring CommonsMultipartResolver和HandlerExceptionResolver工作不一致
我试图使用Spring和CommonsMultipartResolver创建一个上传文件的简单表单 我在Tomcat v7.0.57中使用Spring 4.0.6.RELEASE。我已将这些Apache依赖项添加到pom文件中:Spring CommonsMultipartResolver和HandlerExceptionResolver工作不一致,spring,spring-mvc,apache-commons-fileupload,Spring,Spring Mvc,Apache Commons Fileupload,我试图使用Spring和CommonsMultipartResolver创建一个上传文件的简单表单 我在Tomcat v7.0.57中使用Spring 4.0.6.RELEASE。我已将这些Apache依赖项添加到pom文件中: <!-- Apache Commons FileUpload --> <dependency> <groupId>commons-fileupload</groupId>
<!-- Apache Commons FileUpload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Apache Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
如果我将maxUploadSize设置为较小的值(即1mb),并上载一个稍大一点的文件(我用一个1.7mb的文件进行了测试),这将正常工作,并显示页面,向用户显示错误。但是,对于5MB的更大限制,如果我上载的文件仅比限制大几个字节,我的resolveException方法会被多次调用,但页面不会被加载。我使用Chrome和Firefox进行了测试。在Firefox中,我得到一个错误,说“连接已重置”。在“网络”选项卡中,它显示该帖子已“中止”。在Chrome中,我收到一个错误,说“此网页不可用”,错误代码为:ERR\u CONNECTION\u RESET。在网络标签中,帖子简单地说它“失败了”
我的猜测是,对于较大的文件上载,它会在完成之前取消文件上载,这是我希望保留的行为。但是,在这些情况下,我仍然希望向用户显示一个更好的错误
我尝试将CommonsMultipartResolver的maxInMemorySize属性增加到10mb,但这似乎没有任何效果。有人能帮我找出哪里出了问题吗?终于找到了问题所在。它实际上与HandlerExceptionResolver无关,似乎是由于我正在使用的Tomcat版本(7.0.57)中的一个设置。在server.xml中,我必须在我的连接器上指定“max燕子大小”属性 根据Tomcat文档,MaxEnswentSize是“请求正文字节的最大数量(不包括传输编码开销)”这将被Tomcat吞并以中止上载。中止上载是指Tomcat知道请求正文将被忽略,但客户端仍发送请求正文。如果Tomcat不吞并正文,客户端不太可能看到响应。如果未指定默认值2097152(2 MB)将使用。小于零的值表示不应强制执行限制。“
您能否添加更多详细信息,如spring版本、apache commons版本、用于测试的浏览器等,您是如何做到的?我是说你说的?如果你能写的话。。非常有帮助。下面是my server.xml的相关部分:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5120000" />
</bean>
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("website/upload");
if (e instanceof MaxUploadSizeExceededException)
{
modelAndView.addObject("errors", "Maximum upload size of " + (((MaxUploadSizeExceededException) e).getMaxUploadSize() + " bytes exceeded"));
}
else
{
modelAndView.addObject("errors", "An unexpected error occurred. Please try again later.");
}
return modelAndView;
}