zoukankan      html  css  js  c++  java
  • [六字真言]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="#{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="#{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>




  • 相关阅读:
    react 有多个按钮时点击单个按钮独立控制Loading
    React路由通信
    体育竞技模拟比赛
    json与csv格式相互转换
    替换表格内容及csv转html及CGI
    excel转换成csv格式
    文件读写笔记
    自定义手绘风
    numpy&matplotlib读书笔记
    Python成绩雷达图
  • 原文地址:https://www.cnblogs.com/pangxiansheng/p/2e53b9fe7b46f1dff69b8efccb3db5ee.html
Copyright © 2011-2022 走看看