我正在尝试使用Spring和CommonsMultipartResolver创建一个上传文件的简单表单。
我正在使用Spring 4.0.6.RELEASE和Tomcat v7.0.57。我已将这些Apache依赖项添加到我的pom文件中:
<!-- 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>
我的spring 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;
}
如果我将maxUploadSize设置为更小的值(即1mb)并上传更大的文件(我使用1.7mb的文件进行测试),这样可以正常工作并显示页面,向用户显示错误。但是,如果我上传一个比限制大几个字节的文件,我的resolveException方法被多次调用,但是没有加载该页面。我使用Chrome和Firefox进行了测试。在Firefox中,我收到错误消息,说明&#34;连接已重置&#34;。在网络选项卡中,它表示POST是&#34; Aborted&#34;。在Chrome中,我收到错误消息&#34;此网页不可用&#34;错误代码:ERR_CONNECTION_RESET。在网络选项卡中,POST只是说它失败了#34;。
我的猜测是,对于较大的文件上传,它会在文件上传完成之前取消,这是我想保留的行为。但是,我仍然希望在这些情况下向用户显示更好的错误。
我尝试将CommonsMultipartResolver的maxInMemorySize属性增加到10mb,但这似乎没有任何效果。有人能帮我弄清楚我哪里出错吗?
答案 0 :(得分:0)
终于找到了问题所在。它实际上与HandlerExceptionResolver无关,似乎是由于我正在使用的Tomcat版本中的设置(7.0.57)。在server.xml中,我必须指定&#34; maxSwallowSize&#34;我的连接器上的属性。
根据Tomcat文档,maxSwallowSize是&#34; Tomcat将为中止上载吞下的最大请求正文字节数(不包括传输编码开销)。中止上传是指Tomcat知道请求体将被忽略但客户端仍然发送它。如果Tomcat没有吞下身体,则客户端不太可能看到响应。如果未指定,将使用默认值2097152(2兆字节)。值小于零表示不应强制执行限制。&#34;