在项目中使用springMVC 上传文件的时候,在上传文件的大小超过设定的值之后,异常解析器中的异常输出信息无法输出。
上传文件的时候有个文件大小的限制,在超出这个限制之后.会抛出MaxUploadSizeExceededException异常,该异常是spring检查上传文件的信息的时候抛出的,此时还没进入Controller内解析文件的方法中。
产生原因:tomcat7.0.65版本的bug。
a:超过文件大小的:
b:没超过限定大小的文件上传成功之后返回数据正确.
解决方式:
1:
更换tomcat版本。
apache-tomcat-7.0.67 (不可用)
apache-tomcat-7.0.65 (不可用)
apache-tomcat-7.0.38(可用)
apache-tomcat-7.0.39 (可用)apache-tomcat-7.0.70 (可用)
2:拦截器处理
首先把<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 单文件上传大小20M ,这里需要设置的大一点,避免在拦截器之前出现异常,很重要,这里是400M-->
<!--maxUploadSize 使用拦截器时可以不用设置-->
<property name="maxUploadSize" value="409715200"/>
<property name="defaultEncoding" value="UTF-8" />
</bean>
中的最大上传值弄大一点,避免抛出异常
<mvc:interceptors> <mvc:interceptor> <!--此处只拦截文件上传的请求--> <mvc:mapping path="/file/fileUpload.do"/> <bean class="com.sso.interceptor.FileInterceptor"> <property name="MAX_UPLOAD_SIZE" value="20971520"/> </bean> </mvc:interceptor> </mvc:interceptors>
创建拦截器
FileInterceptor.Java
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断是否是多文件上传的请求
if (request != null && ServletFileUpload.isMultipartContent(request)) {
ServletRequestContext requestContext = new ServletRequestContext(request);
long requsetSize = requestContext.getContentLength();
if (requsetSize > MAX_UPLOAD_SIZE) {
ObjectMapper mapper = new ObjectMapper();
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
PrintWriter writer = response.getWriter();
//json输出提示信息
JSONObject json = new JSONObject();
json.put("message", "上传文件太大,不能超过" + maxSize / 1024 / 1024 + "M !");
json.put("status", "1");
mapper.writeValue(writer,json);
writer.flush();
return false;
}
}
return true;
}