解决 SpringBoot 文件上传 MultipartException 异常问题

本文介绍了解决SpringMVC中文件上传超过最大限制的问题,通过调整配置文件中的Multipart对象文件大小上限,并在Controller中独立设置阀值,实现不同接口有不同的上传限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件上传超过最大限制?
服务器报出 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");
    }
}

这样处理应该就没有什么问题了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值