springboot文件上传大小的控制

在做项目开发的过程中,会遇到文件上传的需求,文件上传的大小就需要我们开发人员进行控制,防止过大的文件导致后续操作的失败,比如:过大的excel(07版本)文件解析过程中导致后台内存溢出。

springBoot 文件上传大小配置
  • 一次请求大小控制

    一次request请求,所有文件的大小之和。

  • 文件大小控制

    上传的文件的每个大小

1
2
3
4
5
6
7
spring:
servlet:
multipart:
enabled: true #是否支持批量上传
resolve-lazily: true #是否延迟解析文件
max-file-size: 100MB #单个文件上传大小
max-request-size: 100MB #一次请求中所有文件大小和

在配置的过程中,max-file-size 要小于等于 max-request-size,并且都要配置,因为spring在验证的时候,是先验证 你的所有文件大小是否小于 max-request-size , 如果满足 然后再分别验证 每个文件是否都小于max-file-size这个值,所以在开发过程中你只配置 max-file-size 是不行的。会抛出MultipartException异常信息。

同时,我们要将这个异常告诉前台,比如:当前台用户选择了一个大于我们配置100M大小的文件上传的时候,我们希望给前台一个友好的提示,告诉他,我们系统最大支持100M,

springBoot 异常处理
  • @ExceptionHandler 使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

@RestControllerAdvice
@Order(1)
public class ExceptionHandler {
//这里获取系统配置的最大上传大小,如果没有配置就为空
@Value("${spring.servlet.multipart.max-request-size:#{null}}")
private String maxFile;

/**
* 上传文件过大异常(返回值,可以任意,和前台做好配合就可以)
* @param e
* @return
*/
@ExceptionHandler(MultipartException.class)
public ExceptionResult handlerMultipartException(MultipartException e) {
e.printStackTrace();
if(StringUtils.isEmpty(maxFile)) {
maxFile = "1M";
}
return new ExceptionResult(ExceptionCodeCost.EXCEPTION_FILE_BIG, new String[] {maxFile});
}
}

这样,当我们前台上传大于我们配置的文件的时候,应该就可以接受到我们返回的信息了吧?然而并没有

tomcat 文件大小的配置
  • tomcat 上传文件大小配置

我们的springBoot项目是运行在tomcat中的(jar包部署的也类似,只是内置的tomcat),所以我们只在springBoot项目中配置文件的大小配置是不合适的,因为tomcat默认允许的最大文件上传大小可能就比你配置的要小,并且当tomcat配置的文件大小小的时候,我们通过httpRespose返回的友好提示,根本无法返回。请求会直接变成500(这里还有tomcat上传大小的一个坑).

修改tomcat\conf\server.xm下的Connector节点,增加maxSwallowSize=”-1”的配置。再上传大文件的时候,服务端正确响应。

1
<Connector maxSwallowSize="-1" connectionTimeout="20000"port="80" protocol="HTTP/1.1" redirectPort="8443"/>

不管配置成 -1 这个不推荐,-1代表tomcat不对文件上传大小做校验,尽量配合项目配置合适的大小,比项目大一点就可以了。

配置了tomcat我们前台就可以拿到友好的提示信息了,当然如果你还有nginx,或者其他的代理,都需要对文件大小进行配置。