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>




  • 相关阅读:
    markdown===在新窗口中打开网址的解决办法,以及其他遗留问题!
    关于比特币
    给windows设置隐藏文件夹的方法
    python实战===百度文字识别sdk
    python实战===用python对比两张图片的不同
    python基础===python os.path模块
    python实战===爬取所有微信好友的信息
    python基础===Sublime Text 3 快捷键
    python实战===一键刷屏
    linux===进程操作
  • 原文地址:https://www.cnblogs.com/pangxiansheng/p/2e53b9fe7b46f1dff69b8efccb3db5ee.html
Copyright © 2011-2022 走看看