首页 > 代码库 > [六字真言]6.吽.SpringMVC中上传大小异常填坑

[六字真言]6.吽.SpringMVC中上传大小异常填坑

最近在讲课的时候,遇到了关于上传文件过大的时候浏览器无法响应的问题,配置了捕获异常,有的学生浏览器好使,有的学生浏览器不好用!莫名其妙!
MaxUploadSizeExceededException进入了无限的死循环,╮(╯▽╰)╭ 悲催! 为什么呢?

配置上传信息

在springmvc的核心配置文件配置如下信息

  1. <!-- 5.配置上传 -->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <property name="defaultEncoding" value="UTF-8"/>
  4. <!-- 可以使用计算的 value="http://www.mamicode.com/#{20*1024*1024}"/> -->
  5. <property name="maxUploadSize" value="20971520"/>
  6. <property name="maxInMemorySize" value="2048"/>
  7. <property name="resolveLazily" value="true"/>
  8. <!-- 配置的是虚拟路径 -->
  9. <property name="uploadTempDir" value="/uploadFile/temp"/>
  10. </bean>
  • id="multipartResolver" 需要去修改其id的名称
  • resolveLazily 属性启用是为了推迟文件解析,以便在上传操作中捕获文件大小异常

第一种方式:Controller使用异常注解

  1. @ExceptionHandler(Exception.class)
  2. public String handleException(Exception ex,HttpServletRequest request) {
  3. if(ex instanceof org.springframework.web.multipart.MaxUploadSizeExceededException){
  4. request.setAttribute("error", "上传文件过大");
  5. }
  6. return "要转向的页面,可以自由定义或者是原页面.";
  7. }

第二种方式:统一异常处理方式

在SpringMVC的核心配置文件配置统一的异常信息处理

  1. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  2. <property name="exceptionMappings">
  3. <props>
  4. <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">maxUploadExceeded</prop>
  5. </props>
  6. </property>

问题: 使用拦截器解决客户端无响应问题

关于spring mvc MaxUploadSizeExceededException 死循环解决方案

这个问题困扰了我很久了,其实我之前有一种解决方案是在前端进行判断操作,哈哈,之后的笔记会给大家奉献上!
在springmvc的核心配置文件配置如下信息

  1. <!-- 5.配置上传 -->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <property name="defaultEncoding" value="UTF-8"/>
  4. <!-- 可以使用计算的 value="http://www.mamicode.com/#{20*1024*1024}"/> -->
  5. <property name="maxUploadSize" value="20971520"/>
  6. <property name="maxInMemorySize" value="2048"/>
  7. <!-- 配置的是虚拟路径 -->
  8. <property name="uploadTempDir" value="/uploadFile/temp"/>
  9. </bean>

没有定义延时解析

定义拦截器

  1. public class FileUploadInterceptor extends HandlerInterceptorAdapter {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handler )
  4. throws Exception {
  5. if(request!=null && ServletFileUpload.isMultipartContent(request)) {
  6. ServletRequestContext ctx = new ServletRequestContext(request);
  7. long requestSize = ctx.contentLength();
  8. if (requestSize > maxSize) {
  9. throw new MaxUploadSizeExceededException(maxSize);
  10. }
  11. }
  12. return true;
  13. }
  14. private long maxSize;
  15. public void setMaxSize(long maxSize) {
  16. this.maxSize = maxSize;
  17. }
  18. }

配置拦截器

  1. <mvc:interceptor>
  2. <mvc:mapping path="/**"/>
  3. <bean class="com.shxt.interceptor.FileUploadInterceptor">
  4. <property name="maxSize" value="4194304"/>
  5. </bean>
  6. </mvc:interceptor>


来自为知笔记(Wiz)


[六字真言]6.吽.SpringMVC中上传大小异常填坑