SpringBoot当文件上载大小限制超过获取MultipartException而不是MaxUploadSizeExceededException时

K. *_*ddy 9 java spring-mvc spring-boot

我有简单的SpringBoot应用程序文件上传功能,其中最大文件上传文件大小为2 MB.

我已经配置multipart.max-file-size=2MB它工作正常.但是当我尝试上传大小超过2 MB的文件时,我想处理该错误并显示错误消息.

为此我有我的控制器实现HandlerExceptionResolverresolveException()实现如下:

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("msg", exception.getMessage());
        } else
        {
            model.put("msg", "Unexpected error: " + exception.getMessage());
        }

        return new ModelAndView("homepage", model);
    }
Run Code Online (Sandbox Code Playgroud)

问题是我得到的异常是MultipartException而不是MaxUploadSizeExceededException.

stacktrace是: 无法解析多部分servlet请求; 嵌套异常是java.lang.IllegalStateException:org.apache.tomcat.util.http.fileupload.FileUploadBase $ FileSizeLimitExceededException:字段myFile超过其允许的最大大小2097152字节.

在文件大小超过的情况下为什么我没有得到MaxUploadSizeExceededException?我得到它的父Exception MultipartException,除了文件大小超出之外,还可能由于许多其他原因而发生.

有什么想法吗?

小智 7

我遇到了同样的问题,看起来只有 Commons File Upload 的 MultipartResolver 实现抛出 MaxUploadSizeExceededException 而不是 MultipartResolver Servlet 3.0 实现。

这是我到目前为止所做的。这里的关键是允许在控制器上检查文件,然后您可以验证大小并设置错误。

  1. 在 multipart 下面设置 multipart 属性: max-file-size: -1 max-request-size: -1

  2. 设置 Tomcat 8 (maxSwallowSize="-1")

  3. 在控制器上,添加逻辑来检查大小

    if(fileAttachment.getSize() > 10485760) { throw new MaxUploadSizeExceededException(fileAttachment.getSize()); }