Spring Boot捕获文件大小限制异常

2,559 阅读1分钟

业务场景

上传文件是web项目中常见且较为复杂的业务

限制文件的类型与大小是其中重要的校验环节

本文就着重讲解下如何限制文件大小和在实现中可能会遇到的坑

解决方案

增加配置

在配置文件中增加如下配置:

spring:
    servlet:
        multipart:
            max-file-size=1024MB
            max-request-size=1024MB

全局异常捕获

文件大小限制已经实现, 但大多数情况我们都需要自行处理异常的返回信息

使用全局异常拦截即可:

@RestControllerAdvice
public class GlobalExceptionHandler {
  
  @Autowired
  private MultipartProperties multipartProperties;

  @ExceptionHandler(value = MultipartException.class)
  public @ResponseBody
  RestResult handlerBusinessException(MaxUploadSizeExceededException ex) {
    String msg = "上传文件失败";
    if (ex.getCause().getCause() instanceof FileSizeLimitExceededException) {
      msg = String.format("上传文件过大[单文件大小不得超过%sMB]", multipartProperties.getMaxFileSize().toMegabytes());
    } else if (ex.getCause().getCause() instanceof SizeLimitExceededException) {
      msg = String.format("上传文件过大[上传总文件大小不得超过%sMB]", multipartProperties.getMaxRequestSize().toMegabytes());
    }
    return RestResult.error(new Exception(msg, ex));
  }
}

其中RestResult是笔者封装的统一返回工具, 异常进行web结果返回即可

存在的坑

如果Spring Boot集成Tomcat启动, 可能会出现无法捕获到异常的情况

原因是Tomcat中存在MaxSwallowSize配置

如果它的值小于配置文件中multipart设置的值, tomcat会先于Spring Boot进行异常捕获, 导致Spring Boot的全局异常捕获失效

解决的方式也很容易, 增加Tomcat相关配置即可:

server:
    tomcat:
        max-swallow-size: -1

-1代表不限制大小