业务场景
上传文件是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代表不限制大小