今天使用 SpringBoot 通过 form 表单的形式上传文件,结果上传小文件是正确的;但是上传大文件(大于10M)则抛出如下错误信息:
[ERROR]-[20-07-08 10:46:51 031]-[http-bio-8090-exec-15]-[c.g.c.e.CustomSimpleMappingExceptionResolver]: org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 10000000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (31592358) exceeds the configured maximum (10000000) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:163) at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:143) at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1104) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:936) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:130) at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66) at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:105) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:123) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:341) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
根据上面的错误信息可以得知,SpringBoot 默认上传文件最大大小为10000000KB,但是我们上传的文件实际为 31592358KB。因此抛出了异常,下面将介绍几种解决方式。
(1)修改Tomcat server.xml 配置文件,添加 maxPostSize 进行限制。如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" maxPostSize="-1" redirectPort="8443" URIEncoding="UTF-8" />
注意:maxPostSize 在 6.* 版本中,设置为 0 表示不限制文件大小;在 7.* 版本后,设置为 -1 表示不限制文件大小。官方给出的信息如下:
Tomcat 6 的说明信息如下图:
原文地址:https://tomcat.apache.org/tomcat-6.0-doc/config/http.html
Tomcat 7 的说明信息如下图:
原文地址:https://tomcat.apache.org/tomcat-7.0-doc/changelog.html
(2)如果你使用了 nginx 代理服务器,则需要查看 nginx 是否有限制请求数据大小
server { listen 80; #server_name localhost; client_max_body_size 500M; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass https://127.0.0.1:8080/; } }
其中,client_max_body_size 500M 表示限制上传文件大小最大为 500M。
(3)配置 Spring Boot 上传文件的限制。不同版本的 Spring Boot 配置稍有区别,配置如下:
SpringBoot 1.* 版本配置如下:
# 属性配置文件 # 单个文件最大大小 spring.http.multipart.maxFileSize=20Mb # 所有上传文件最大大小 spring.http.multipart.maxRequestSize=100Mb # yml 配置文件 spring: http: multipart: # 单个文件最大大小 maxFileSize: 20Mb # 所有上传文件最大大小 maxRequestSize: 100Mb
SpringBoot 2.* 版本配置如下:
# 属性配置文件 # 单个文件最大大小 spring.servlet.multipart.max-file-size=20MB # 所有上传文件最大大小 spring.servlet.multipart.max-request-size=100MB # yml 配置文件 spring: servlet: multipart: # 单个文件最大大小 max-file-size: 20MB # 所有上传文件最大大小 max-request-size: 100MB
(4)如果上面配置都没有起作用,检查一下你的 Spring MVC 配置是否限制了文件上传大小。配置如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8"> <property name="maxUploadSize" value="524288000" /> <property name="maxInMemorySize" value="4096" /> </bean>
上面这些都是在解决这个问题时在网上找到的解决办法,为了以后方便查阅,因此记录和分享。