问题描述:
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); } @Bean public 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提示。