文件上传超过最大限制?
服务器报出 MultipartException,file size exceed limit 异常?
异常捕获了无法正确返回对象给客户端?
业务需要不同接口有不一样的上传限制?
以下是我的解决办法。
我们先看一下 SpringMVC 的请求流程
这张图解释了我们在 Controller 里无法捕获异常的原因,是因为 MultipartException 在前两个阶段就被捕获并抛出了(并有return值),并未到达 Controller 层。这里也是为什么我们设置了全局捕获,可以捕获 MultipartException 异常却无法正确返回对象给前端的原因(return值被提前处理)。
我的解决办法总体思路是:1. 把Multipart 对象文件大小上限设置成一个平时达不到的值。2. 在 Controller 里有上传业务的接口里独立设置阀值。
一、修改 SpringBoot 配置文件
我的是在 application.properties 里,把以下两个值改大,一般10G够用了。
可以加上一些自定义阀值的属性,比如我是 upload.maxFaceImageSize。注意这边用的单位都是Byte
spring.servlet.multipart.maxFileSize=10240MB
spring.servlet.multipart.maxRequestSize=10240MB
# 文件上传自定义配置
# 5MB = 5242880 byte
# 10GB = 10737418240 byte
upload.maxFaceImageSize=5242880
upload.maxVideoSize=10737418240
二、在 Controller 里有上传业务的接口里加上判断
首先我们要先把我们自定义的阀值用 @Value 注入,然后在接口中加上对上传文件大小的逻辑判断,如果超出阀值返回错误。代码如下:
@Value("${upload.maxFaceImageSize}")
private long MAX_FACE_IMAGE_SIZE;
public JSONResult uploadFace(String userId, MultipartFile file) throws Exception {
if (file.getSize() > MAX_FACE_IMAGE_SIZE) {
System.out.println("Refuse: Uploaded file size exceed this server's limit.");
System.out.println("MAX_FACE_IMAGE_SIZE = " + MAX_FACE_IMAGE_SIZE);
System.out.println("Uploaded file size = " + file.getSize());
// throw new MultipartException("");
return JSONResult.errorMsg("Uploaded file size exceed limit.");
}
}
这样就完事了。
当然你也可以选择采用抛出异常,全局捕获统一返回的方式(见步骤三)。抛出异常的代码上面被我注释掉了。
三、创建一个专门捕获异常的类
各位看官如果想要规范的写这个类还劳另行百度,我这边偷个懒直接在 Application 启动类里加上这个类了。代码如下:
@ControllerAdvice
public class ExceptionProcess {
// 对这个异常的统一处理,返回值 和Controller的返回规则一样
@ExceptionHandler(MultipartException.class)
public JSONResult handleAll(Throwable t){
System.out.println("Uploaded file size exceed server's limit");
return JSONResult.errorException("Uploaded file size exceed server's limit");
}
}
这样处理应该就没有什么问题了。