空夜

SpringBoot请求及上传文件大小限制问题的解决
注:SpringBoot1.x和2.x对上传文件大小的配置是不一样的。2.x的解决办法请看最后。问题描述(Spri...
扫描右侧二维码阅读全文
12
2018/12

SpringBoot请求及上传文件大小限制问题的解决

注:SpringBoot1.x和2.x对上传文件大小的配置是不一样的。2.x的解决办法请看最后。


问题描述(SpringBoot1.x)

前两天写文件上传,接口写好后测试了一下,上传了一个大约15MB的文件,报错org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (16190292) exceeds the configured maximum (10485760)

于是研究了一下这个问题。找了一些资料。发现SpringBoot处理请求和文件上传时由于文件大小限制会报以下两个问题:

  • 1.请求超过10MB:
    org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (16190292) exceeds the configured maximum (10485760)

注:10485760 = 10 1024 1024 = 10MB

  • 2.上传的文件超过1MB但请求总体大小未超过10MB:
    org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.

注:1048576 = 1 1024 1024 = 1MB。也就是说,即使请求总体大小小于10MB,而某个文件的大小超过1MB,依然会上传失败。


问题来源--源码分析

分析的时候找到了SpringBoot的相关源码——MultipartProperties 类,源码如下:

package org.springframework.boot.autoconfigure.web;

import javax.servlet.MultipartConfigElement;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.util.StringUtils;

ConfigurationProperties(
  prefix = "spring.http.multipart",
  ignoreUnknownFields = false
)
public class MultipartProperties {
  private boolean enabled = true;
  private String location;
  private String maxFileSize = "1MB";
  private String maxRequestSize = "10MB";
  private String fileSizeThreshold = "0";
  private boolean resolveLazily = false;

  // .... 省略了一些get和set方法
}

从上面的源代码中我们可以看到,maxFileSize ,即最大文件大小,被限制为1MB,maxRequestSize 即最大请求大小,被限制为10MB。这样一来问题就很明显了。
正是由于这两个配置的原因导致我的文件无法上传。
那么我们如何解决这个问题呢?


通过SpringBoot配置文件解决文件上传大小限制

解决问题的办法很简单,在SpringBoot的配置文件(默认是application.properties)加上以下两行即可:

spring.http.multipart.max-request-size=20MB
spring.http.multipart.max-file-size=20MB

如上,我将请求总体大小和单个文件大小的限制设为20MB,那么我之前那个15MB的文件就上传成功了。


SpringBoot2.0

升级到SpringBoot2.0后,上面1.0的配置是不起作用的,需要将其更改为:

spring.servlet.multipart.max-request-size=20MB
spring.servlet.multipart.max-file-size=20MB

相关原因可以查看Springboot的MultipartProperties类的源码,会发现该类的注解中prefixspring.http.multipart变成了spring.servlet.multipart。如下:

Alt text


交流

如果大家有兴趣一起学习技术,一起交流讨论,可以加入QQ群:701365388,目前基本没什么人气啦(ฅ´ω`ฅ),不过有问题群主会努力解答的。嘿嘿٩(ˊᗜˋ*)و。

Contact Me

If you have any problem or ideas about my blogs or projects, you can contact me using any ways in the following list →_→:

Last modification:December 18th, 2018 at 05:30 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment