[六字真言]6.吽.SpringMVC中上传大小异常填坑
最近在讲课的时候,遇到了关于上传文件过大的时候浏览器无法响应的问题,配置了捕获异常,有的学生浏览器好使,有的学生浏览器不好用!莫名其妙!
MaxUploadSizeExceededException进入了无限的死循环,╮(╯▽╰)╭ 悲催! 为什么呢?
配置上传信息
在springmvc的核心配置文件配置如下信息
<!-- 5.配置上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<!-- 可以使用计算的 value="#{20*1024*1024}"/> -->
<property name="maxUploadSize" value="20971520"/>
<property name="maxInMemorySize" value="2048"/>
<property name="resolveLazily" value="true"/>
<!-- 配置的是虚拟路径 -->
<property name="uploadTempDir" value="/uploadFile/temp"/>
</bean>
- id="multipartResolver" 需要去修改其id的名称
- resolveLazily 属性启用是为了推迟文件解析,以便在上传操作中捕获文件大小异常
第一种方式:Controller使用异常注解
@ExceptionHandler(Exception.class)
public String handleException(Exception ex,HttpServletRequest request) {
if(ex instanceof org.springframework.web.multipart.MaxUploadSizeExceededException){
request.setAttribute("error", "上传文件过大");
}
return "要转向的页面,可以自由定义或者是原页面.";
}
第二种方式:统一异常处理方式
在SpringMVC的核心配置文件配置统一的异常信息处理
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">maxUploadExceeded</prop>
</props>
</property>
问题: 使用拦截器解决客户端无响应问题
关于spring mvc MaxUploadSizeExceededException 死循环解决方案
这个问题困扰了我很久了,其实我之前有一种解决方案是在前端进行判断操作,哈哈,之后的笔记会给大家奉献上!
在springmvc的核心配置文件配置如下信息
<!-- 5.配置上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<!-- 可以使用计算的 value="#{20*1024*1024}"/> -->
<property name="maxUploadSize" value="20971520"/>
<property name="maxInMemorySize" value="2048"/>
<!-- 配置的是虚拟路径 -->
<property name="uploadTempDir" value="/uploadFile/temp"/>
</bean>
没有定义延时解析
定义拦截器
public class FileUploadInterceptor extends HandlerInterceptorAdapter {
@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;
}
private long maxSize;
public void setMaxSize(long maxSize) {
this.maxSize = maxSize;
}
}
配置拦截器
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.shxt.interceptor.FileUploadInterceptor">
<property name="maxSize" value="4194304"/>
</bean>
</mvc:interceptor>