java - 使用 Spring 4 处理 FileUploadBase.SizeLimitExceededException

标签 java spring file-upload

我在使用 Spring 处理文件上传异常时遇到问题。

我有下一个 multipartResolver:

@Bean
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
    commonsMultipartResolver.setDefaultEncoding(this.defaultEncoding);
    commonsMultipartResolver.setMaxInMemorySize(this.maxInMemorySize);
    commonsMultipartResolver.setMaxUploadSize(this.maxUploadSize);
    commonsMultipartResolver.setMaxUploadSizePerFile(this.maxUploadSizePerFile);
    return commonsMultipartResolver;
}

使用下一个常量值:

webmvc.multipart.maxInMemorySize=10485760 //10MB
webmvc.multipart.maxUploadSize=10485760 //10MB
webmvc.multipart.maxUploadSizePerFile=5242880 //5MB

我有下一个 GlobalExceptionHandler:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = MultipartException.class)
    public String handleMultipartException(Exception ex, HttpServletRequest request) {
        if (ex instanceof MultipartException) {
            final MultipartException mEx = (MultipartException) ex;

            if (ex.getCause() instanceof FileUploadBase.FileSizeLimitExceededException) {
                final FileUploadBase.FileSizeLimitExceededException flEx = (FileUploadBase.FileSizeLimitExceededException) mEx.getCause();
                request.setAttribute("size", flEx.getPermittedSize());
            } else if (ex.getCause() instanceof FileUploadBase.SizeLimitExceededException) {
                final FileUploadBase.SizeLimitExceededException flEx = (FileUploadBase.SizeLimitExceededException) mEx.getCause();
                request.setAttribute("size", flEx.getPermittedSize());
            } else {
                request.setAttribute("error", ex.getMessage());
            }
        } else {
            request.setAttribute("error", ex.getMessage());
        }
        return "forward:/errors.do";
    }
}

如果我上传一个小于 5MB 的文件,一切正常,不会引发任何异常,并且文件会正确上传。

如果我上传 5MB 到 10MB 之间的文件,异常会被我的 GlobalExceptionHandler 捕获,结果会显示在我的页面/errors

但是,如果我上传的文件大于 10MB,我的 GlobalExceptionHandler 会捕获异常并转发到/errors,但是!,然后 GlobalExceptionHandler 会再次捕获异常,并继续执行直到时间结束。

如果我没有误解的话,即使在 GlobalExceptionHandler 捕获异常并尝试转发到完全不同的页面之后,CommonsMultipartResolver 似乎也会一遍又一遍地处理我的多部分内容(我尝试使用重定向而不是转发,并且问题仍然存在)。

为什么它在两种情况下的表现不一样?我该如何解决这个问题?

我尝试设置 webmvc.multipart.maxInMemorySize=-1webmvc.multipart.maxUploadSize=-1 但每当我上传更大的内容时就会发生此行为超过 5MB。

最佳答案

我认为您需要 MaxUploadSizeExceededException 的异常处理程序

@ExceptionHandler(MaxUploadSizeExceededException.class)
    public String handleError(MaxUploadSizeExceededException e, RedirectAttributes redirectAttributes) {
        .......
    }

您可以在此处查看更多内容

https://www.mkyong.com/spring/spring-mvc-how-to-handle-max-upload-size-exceeded-exception/

关于java - 使用 Spring 4 处理 FileUploadBase.SizeLimitExceededException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42717777/

相关文章:

Spring Boot - MongoDB - 继承

java - 在 Mule 应用程序中使用参数

java - MongoRepository findOne 使用 "id"而不是 "_id"

javascript - 如何在ajax jquery中排队文件上传?

Java 泛型转换

java - Dart 中的类对象列表

java - token "||"上的语法错误,无效的 OnlySynchronized

java - Android Java百分比计算

php - 如何解决上传限制

Grails 上传图片