MaxUploadSizeExceededException异常

Spring中向服务器上传图片需要进行配置bean CommonsMultipartResolver;具体配置如下:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默认编码 (ISO-8859-1) -->
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 最大内存大小 (10240) -->
        <property name="maxInMemorySize" value="10240"/>
        <!-- 上传后的目录名 -->
        <!--<property name="uploadTempDir" value="/upload"/>-->
        <!-- 最大文件大小,-1为无限止(-1),最大上传文件3M -->
        <property name="maxUploadSize" value="3000000"/>
    </bean>

上面的配置中可以看到设置的文件上传的大小限制为3M;当上传的文件的大小超过上限时,便会抛出MaxUploadSizeExceededException异常。

今天遇到的最大的问题便是:如何优雅的处理MaxUploadSizeExceededException异常?

MaxUploadSizeExceededException异常的特殊之处在于,当上传文件的大小超过限制时,它的抛出并是在进入Controller之前,所以不能在controller中利用注解@ExceptionHandler(MaxUploadSizeExceededException.class)来定义该异常的处理方法;

经过网上的搜索,出了利用filter以为,还看到其它三种处理办法:

1.在xml中配置SimpleMappingExceptionResolver,其中加入对MaxUploadSizeExceededException异常的处理,指定对应的错误页面,具体如下:

<!-- 全局异常处理 -->
    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!-- 处理超过大小时的异常 -->
                <!--遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/views/errors/upload.jsp页面 -->
                <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">errors/upload</prop>
            </props>
        </property>
    </bean>

2.将对应的controller实现HandlerExceptionResolver接口,然后重写其中的resolveException方法,返回ModelAndView,用于对MaxUploadSizeExceededException进行处理,具体如下:

@Controller
public class FileUploadController  implements HandlerExceptionResolver
{

    /*** Trap Exceptions during the upload and show errors back in view form ***/
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception exception)
    {
        Map<String, Object> model = new HashMap<String, Object>();
        if (exception instanceof MaxUploadSizeExceededException)
        {
            model.put("errors", exception.getMessage());
        } else
        {
            model.put("errors", "Unexpected error: " + exception.getMessage());
        }
        model.put("uploadedFile", new UploadedFile());
        return new ModelAndView("/upload", model);
    }

}

3.继承CommonsMultipartResolver类,重写parseRequest方法,在其中对MaxUploadSizeExceededException异常信息进行处理,放入request中,在controller再进行相应ModelAndView的返回,具体如下:

public class DropOversizeFilesMultipartResolver extends CommonsMultipartResolver {

    @Override
    protected MultipartParsingResult parseRequest(final HttpServletRequest request) {

        String encoding = determineEncoding(request);
        FileUpload fileUpload = prepareFileUpload(encoding);

        List fileItems;

        try {
            fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
        } catch (FileUploadBase.SizeLimitExceededException ex) {
            request.setAttribute(EXCEPTION_KEY, ex);
            fileItems = Collections.EMPTY_LIST;
        } catch (FileUploadException ex) {
            throw new MultipartException("Could not parse multipart servlet request", ex);
        }

        return parseFileItems(fileItems, encoding);
    }
}

controller

@InitBinder("fileForm")
  protected void initBinderDesignForm(WebDataBinder binder) {
    binder.setValidator(new FileFormValidator());
  }

    @RequestMapping(value = "/my/mapping", method = RequestMethod.POST)
  public ModelAndView acceptFile(HttpServletRequest request, Model model, FormData formData,
      BindingResult result) {

    Object exception = request.getAttribute(DropOversizeFilesMultipartResolver.EXCEPTION_KEY);
    if (exception != null && FileUploadBase.SizeLimitExceededException.class.equals(exception.getClass())) {
      result.rejectValue("file", "<your.message.key>");
      LOGGER.error(exception);
    }

以上三种方法都能够类似实现返回一个ModelAndView来实现对MaxUploadSizeExceededException进行处理;

http://stackoverflow.com/questions/2689989/how-to-handle-maxuploadsizeexceededexception

http://stackoverflow.com/questions/4029583/using-spring-3-exceptionhandler-with-commons-fileupload-and-sizelimitexceededex

时间: 2024-08-09 06:14:31

MaxUploadSizeExceededException异常的相关文章

SpringMvc上传文件抛出3次MaxUploadSizeExceededException 问题

SpringMvc 3.2.18 版本开发的文件上传在Tomcat7 上运行抛出了3个MaxUploadSizeExceededException 异常: 正常情况下 当上传文件大小超过允许的大小时SpirngMvc 会抛出一个MaxUploadSizeExceededException 异常 如下 2018-02-25 23:05:15 WARN http-bio-8080-exec-5 [CommonsMultipartResolver.java:191] Failed to perform

Spring MVC环境中文件上传大小和文件类型限制以及超大文件上传bug问题

    在上一篇文章中,主要介绍了Spirng MVC环境下的正常情况下文件上传功能实现.在实际开发的时候,还会涉及到上传文件大小和类型的限制,接下来就会对Spirng MVC环境下文件上传大小和类型的限制进行介绍,还会讲解到文件上传大小tomcat服务器bug问题及解决方案. 一.文件上传大小限制 这里还是接着上篇文章先介绍Spring MVC下的文件上传大小限制,文件上传大小的限制在springmvc-config.xml中配置文件解析器CommonsMultipartResolver时即可

文件上传(Servlet/Struts2/SpringMVC)

文件上传 Servlet实现 要实现文件上传的功能,必须在form的表单中的添加 enctype="multipart/form-data" 表示以二进制流的方式将文件传给控制器. 需要导入的jar包有:commons-fileupload-1.2.1.jar.commons-io-1.4.jar 文件上传的步骤: (1)创建DiskFileItemFactory的对象. (2)创建ServletFileUpload的对象,需传入DiskFileItemFactory的对象.可以获得封

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

最近在讲课的时候,遇到了关于上传文件过大的时候浏览器无法响应的问题,配置了捕获异常,有的学生浏览器好使,有的学生浏览器不好用!莫名其妙! MaxUploadSizeExceededException进入了无限的死循环,╮(╯▽╰)╭ 悲催! 为什么呢? 配置上传信息 在springmvc的核心配置文件配置如下信息 <!-- 5.配置上传 --> <bean id="multipartResolver" class="org.springframework.w

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

当看到这文章的时候相信你现在应该遇到这样的问题了,我也是自己遇到了后来找到解决方案了记录下来,如果下次遇到就可以直接解决了. 至于为什么会出现这样的情况,可以看这篇文章:https://bz.apache.org/bugzilla/show_bug.cgi?id=57438 这些一个tomcat bug,但不知道什么版本解决了这个问题.所以下面用了另外一个方法搞定它. <!-- 多部分文件上传 --> <bean id="multipartResolver" clas

SpringBoot 逻辑异常统一处理

构建项目 我们将逻辑异常核心处理部分提取出来作为单独的jar供其他模块引用,创建项目在parent项目pom.xml添加公共使用的依赖,配置内容如下所示: <dependencies> <!--Lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true<

Spring MVC异常友好展示

官网 https://docs.spring.io/spring/docs/4.3.25.RELEASE/spring-framework-reference/htmlsingle/ Springmvc.xml 配置springmvc.xml,出现exception返回的界面和对应code返回的界面. 不知道为啥httpcode不起作用,网上也没查到相关资料,于是httpcode对应的异常只能用web.xml实现. <!-- 异常友好展示 --> <bean id="excep

使用 IDEA 创建 Maven Web 项目 (异常)- Disconnected from the target VM, address: &#39;127.0.0.1:59770&#39;, transport: &#39;socket&#39;

运行环境: JDK 版本:1.8 Maven 版本:apache-maven-3.3.3 IDEA 版本:14 maven-jetty-plugin 配置: <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <webAppSourceDirectory>${pro

mybaits非配置原因,导致SqlSession was not registered for synchronization异常

今天运行程序时报了 SqlSession [[email protected]] was not registered for synchronization because synchronization is not active [11:03:17]-Closing non transactional SqlSession [[email protected]] 由于异常是集中处理的,所以报了这样的错误,查了半天,网上结果都是说配置文件出错的,可是我的项目配置文件肯定是没错的,因为项目都开