SpringMVC是一个非常方便的web层框架,我们使用它的文件上传也非常的方便。在SpringMVC中实现文件上传,我们都会在SpringMVC的配置文件中进行上传大小配置。配置代码如下:
<!-- 文件上传的多部分解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的大小 4M,如果同时传多个文件,则是所有文件的大小 -->
<property name="maxUploadSize" value="4000000" />
<!-- 字符编码的设置,默认是ISO-8859 -->
<property name="defaultEncoding" value="utf-8" />
</bean>
运行结果,当上传文件大小没有超过4M,则上传是成功的。但是当上传大小超过配置,则会引发异常:MaxUploadSizeExceededException异常,针对MaxUploadSizeExceededException异常的处理,则需要在SpringMVC的配置文件中进行配置,配置如下:
<!-- 配置SpringMVC框架运行所抛出的异常处理 -->
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 配置捕获什么类型的异常, MaxUploadSizeExceededException, /errorFile 是转跳的URL -->
<prop
key="org.springframework.web.multipart.MaxUploadSizeExceededException">
/errorFile
</prop>
</props>
</property>
</bean>
理论上,应该是可以了!当然,事实上只要你使用apache-tomcat-7.0.39这个版本的tomcat,上面的配置就是正确的。而如果是其他的Tomcat版本,则会出现如下情况,在浏览器上看到的效果如下:

所以你可以更换你的tomcat来解决这个问题。但显然这不是一个好的解决方案。还有一个相对完美的解决方案就是使用sprngMVC拦截器。
public class FileUploadInterceptor extends HandlerInterceptorAdapter {
private long maxSize;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//判断是否文件上传
if(request!=null && ServletFileUpload.isMultipartContent(request)) {
ServletRequestContext ctx = new ServletRequestContext(request);
//获取上传文件尺寸大小
long requestSize = ctx.contentLength();
System.out.println("文件大小是:"+requestSize);
if (requestSize > maxSize) {
//当上传文件大小超过指定大小限制后,模拟抛出MaxUploadSizeExceededException异常
throw new MaxUploadSizeExceededException(maxSize);
}
}
return true;
}
public void setMaxSize(long maxSize) {
this.maxSize = maxSize; //设置文件大小
}
}
拦截器需要在SpringMVC的配置文件中进行配置:
<!-- 文件大小的拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.bdqn.controller.FileUploadInterceptor">
<!-- 设定限制的文件上传大小,其实这才是真正的文件大小配置 -->
<property name="maxSize" value="4000000" />
</bean>
</mvc:interceptor>
</mvc:interceptors>
运行程序,发现文件超过大小配置还是会出现浏览器上的:ERR_CONNECTION_RESET错误提示。原因是请求还没有到达拦截器就引发了异常,返回到浏览器了。问题出现在最开始的:CommonsMultipartResolver对象的配置上,配置了上传文件大小,所以只要更改CommonsMultipartResolver对象的配置就行了,请看文章最前面的代码,把maxUploadSize属性的配置改成了1000000(100M),只要上传的文件在100M内,则不会出现错误了,可以根据需要再设置更大一些。
<!-- 文件上传的多部分解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的大小 100M,如果同时传多个文件,则是所有文件的大小 -->
<property name="maxUploadSize" value="100000000" />
<!-- 字符编码的设置,默认是ISO-8859 -->
<property name="defaultEncoding" value="utf-8" />
</bean>
本文介绍了在SpringMVC中遇到MaxUploadSizeExceededException异常时的处理方法。通过调整SpringMVC配置文件,设置最大上传文件大小,可以避免异常发生。然而,不同Tomcat版本可能需要不同的配置。使用SpringMVC拦截器是另一种解决方案,但即使如此,如果CommonsMultipartResolver配置不当,仍可能导致ERR_CONNECTION_RESET错误。解决办法是正确设置CommonsMultipartResolver的maxUploadSize属性,确保文件大小在允许范围内。
5234





