CommonsMultipartResolver和HandlerExceptionResolver工作不一致

时间:2015-01-12 00:11:15

标签: spring spring-mvc apache-commons-fileupload

我正在尝试使用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,但这似乎没有任何效果。有人能帮我弄清楚我哪里出错吗?

1 个答案:

答案 0 :(得分:0)

终于找到了问题所在。它实际上与HandlerExceptionResolver无关,似乎是由于我正在使用的Tomcat版本中的设置(7.0.57)。在server.xml中,我必须指定&#34; maxSwallowSize&#34;我的连接器上的属性。

根据Tomcat文档,maxSwallowSize是&#34; Tomcat将为中止上载吞下的最大请求正文字节数(不包括传输编码开销)。中止上传是指Tomcat知道请求体将被忽略但客户端仍然发送它。如果Tomcat没有吞下身体,则客户端不太可能看到响应。如果未指定,将使用默认值2097152(2兆字节)。值小于零表示不应强制执行限制。&#34;

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html