问题描述:
springboot 通过MultipartFile接受前端传过来的文件时是有文件大小限制的(springboot内置tomact的的文件传输默认为1MB)
超过默认限制值,出现的异常如下:
Caused by: java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (60271786) exceeds the configured maximum (52428800)
at org.apache.catalina.connector.Request.parseParts(Request.java:2890)
at org.apache.catalina.connector.Request.parseParameters(Request.java:3185)
at org.apache.catalina.connector.Request.getParameter(Request.java:1116)
at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84)
... 31 common frames omitted
Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (60271786) exceeds the configured maximum (52428800)
at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:805)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280)
at org.apache.catalina.connector.Request.parseParts(Request.java:2846)
... 35 common frames omitted
问题解析:
问题是设置了限制大小之后file穿不过去controller,在表单传过去的时候就被拦截抛异常了,需进行的处理:
1.修改上传的文件大小上限
2.前端捕获异常并进行错误提示
问题解决:
1.Springboot通过配置application.yml文件来自定义参数实现上传文件限制的配置
实现:通过application.yml配置参数来实现上传单个文件和所有文件大小的最大值
A 导入依赖 pox.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
B application.yml 中自定义配置参数
spring:
**
#Foruploadingfiles
test-config:
maxFileSize: 50
特别注意:
1.自定义的参数配合不在spring节点下,与spring并行的节点
2.定义的key-val,maxFileSize与值50间一定有空格,亲测,key冒号后与val无空格,则无法获取到val值
定义TestConfig.java 类
packagecom.chinacache.*.config;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix="test-config")
Public class TestConfig{
Private long maxFileSize;
Public long getMaxFileSize(){
Return maxFileSize;
}
Public void setMaxFileSize(longmaxFileSize){
this.maxFileSize=maxFileSize;
}
}
C 调用,使用自定义参数(在启动类App.class文件中配置Bean来设置文件大小)
一般配置就放在启动类中就好了
@SpringBootApplication
publicclassTestApplication{
@Autowired
TestConfig testConfig;
publicstaticvoidmain(String[]args){
SpringApplication.run(TestApplication.class,args);
}
@Beanpublic MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //The max size of file factory.setMaxFileSize(DataSize.ofMegabytes(testConfig.getMaxFileSize())); /// the max size of total files factory.setMaxRequestSize(DataSize.ofMegabytes(testConfig.getMaxAllFilesSize())); return factory.createMultipartConfig();}}
2. 前端捕获异常并进行错误提示
在controller层通过model传配置参数到前端 :model.addAttribute("maxFileSize", tsConfig.getMaxFileSize());
前端获取上传文件的大小与配置的文件大小上限进行比较,并进行warning提示。