最近在做一个ssm小项目,项目中有上传功能,本来是一个激情平常的功能。但当我配置好上传文件的大小后,一测试发现问题了。即使我项目中捕获到了MaxUploadSizeExceededException这个异常,但是浏览器确无响应了。测试几次之后仍然是这种问题,于是网上查了各种资料。最终发现是Tomcat的问题,因为tomcat遇到这个异常后出现了死循环。到Apache官网发现了这个bug的介绍,截图如下:
不过这个问题对于tomcat-7.0.39好像没有影响。如果项目用的是这个版本,应该不会出现这种问题。
如果不想用下面方法,文章后面提供免费tomcat-7.0.39的链接供下载
现在我们来看看如何解决这个问题:
我的做法是:
第一步:先把配置文件中maxUploadSize的值调大些,使之不会抛出异常。
第二步:然后加入一个拦截器控制上传文件的大小,抛出相同的异常。
第三步:最后再在配置文件中配置拦截器上传文件的大小即可。
第一步代码片段:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件大小上限,单位为字节 -->
<property name="maxUploadSize">
<value>104857600</value>
</property>
<!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
<!--resolveLazily属性启用是为了推迟文件解析,以便在UploadController 中捕获文件大小异常-->
<property name="resolveLazily" value="true"/>
</bean>
第二步代码片段:
public class FileUploadInterceptor implements HandlerInterceptor {
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();
if (requestSize > maxSize) {
throw new MaxUploadSizeExceededException(maxSize);
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
public void setMaxSize(long maxSize) {
this.maxSize = maxSize;
}
}
第三步代码片段:
<!-- 上传文件大小拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.benett.SIMS.interceptor.FileUploadInterceptor">
<property name="maxSize" value="4194304"/>
</bean>
</mvc:interceptor>
这样,你再去拦截异常时MaxUploadSizeExceededException,这个异常就可以任你处置了,不会再出现浏览器无响应的情况了。
附上一张抓住这个异常处理后的页面:
tomcat下载链接:点击打开链接 http://download.youkuaiyun.com/detail/sky_100/9798087