我在开发时文件上传接口时, 测试过程中发现, 上传文件过大时虽然全局异常捕获到了, 但是异常处理结果不返回到前端。
后台报错:
2019-10-12 10:09:02.881 [http-nio-8989-exec-10] ERROR com.szjk.file.exception.GlobalExceptionHandler - 异常:Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (80405163) exceeds the configured maximum (10485760)
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (80405163) exceeds the configured maximum (10485760)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.handleParseFailure(StandardMultipartHttpServletRequest.java:121)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:114)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:87)
at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:87)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1176)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1011)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
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:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
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:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (80405163) exceeds the configured maximum (10485760)
at org.apache.catalina.connector.Request.parseParts(Request.java:2899)
at org.apache.catalina.connector.Request.parseParameters(Request.java:3194)
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)
... 24 more
Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (80405163) exceeds the configured maximum (10485760)
at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:808)
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:2855)
... 28 more
且接口调用没有异常处理结果,解决办法如下:
只需要在项目application.yml中配置:
server:
tomcat:
max-swallow-size: -1 #内置tomcat限制文件最大大小 -1为不限制
spring:
servlet:
multipart:
max-file-size: 20MB #单文件最大限制
max-request-size: 200MB #总文件最大限制
配置好后,上传文件超过限制,异常正常捕获并返回可接口调用端
然后满心欢喜,打包运行在tomcat中(tomcat9), 哦豁, 报错,
tomca9中日志报错信息如下:
2019-10-12 09:41:21.384 [http-nio-8080-exec-8] ERROR com.szjk.file.exception.GlobalExceptionHandler - 异常:Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase
F
i
l
e
S
i
z
e
L
i
m
i
t
E
x
c
e
e
d
e
d
E
x
c
e
p
t
i
o
n
:
T
h
e
f
i
e
l
d
f
i
l
e
e
x
c
e
e
d
s
i
t
s
m
a
x
i
m
u
m
p
e
r
m
i
t
t
e
d
s
i
z
e
o
f
20971520
b
y
t
e
s
.
2019
−
10
−
1209
:
41
:
22.348
[
h
t
t
p
−
n
i
o
−
8080
−
e
x
e
c
−
9
]
E
R
R
O
R
c
o
m
.
s
z
j
k
.
f
i
l
e
.
e
x
c
e
p
t
i
o
n
.
G
l
o
b
a
l
E
x
c
e
p
t
i
o
n
H
a
n
d
l
e
r
−
异
常
:
M
a
x
i
m
u
m
u
p
l
o
a
d
s
i
z
e
e
x
c
e
e
d
e
d
;
n
e
s
t
e
d
e
x
c
e
p
t
i
o
n
i
s
j
a
v
a
.
l
a
n
g
.
I
l
l
e
g
a
l
S
t
a
t
e
E
x
c
e
p
t
i
o
n
:
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
h
t
t
p
.
f
i
l
e
u
p
l
o
a
d
.
F
i
l
e
U
p
l
o
a
d
B
a
s
e
FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 20971520 bytes. 2019-10-12 09:41:22.348 [http-nio-8080-exec-9] ERROR com.szjk.file.exception.GlobalExceptionHandler - 异常:Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase
FileSizeLimitExceededException:Thefieldfileexceedsitsmaximumpermittedsizeof20971520bytes.2019−10−1209:41:22.348[http−nio−8080−exec−9]ERRORcom.szjk.file.exception.GlobalExceptionHandler−异常:Maximumuploadsizeexceeded;nestedexceptionisjava.lang.IllegalStateException:org.apache.tomcat.util.http.fileupload.FileUploadBaseFileSizeLimitExceededException: The field file exceeds its maximum permitted size of 20971520 bytes.
2019-10-12 09:41:23.335 [http-nio-8080-exec-10] ERROR com.szjk.file.exception.GlobalExceptionHandler - 异常:Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 20971520 bytes.
然后搜索解决方案。。。。
网上说在tomcat的server.xml 文件中 <Connector 配置 maxPostSize="-1" 。
不行不行不行。。。。。
还试了其他的方法
还是不行
最后快放弃的时候,想到既然springboot项目运行在内置的tomcat中配置 max-swallow-size=-1 就可以了,那么试试在tomcat的server.xml文件中配置maxSwallowSize="-1"。果然,application.yml 中的max-swallow-size 参数驼峰命名后配置到<Connector 中。运行tomcat, 上传文件超过限制,异常正常捕获并返回可接口调用端 。 配置如下:![在这里插入图片描述])