org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request;

对,没错,就是今天。已经很久没有写代码的我突然被告知自己维护的服务出BUG了。第一眼看到下面的错误时一脸懵逼,这是什么乱七八糟的玩意?

2019-12-25 15:04:56.607 ERROR 15105 --- [http-nio-8765-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested excepti
on is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.3709991203997752731.8765/work/Tomcat/localhost/ROOT
] is not valid] with root cause

java.io.IOException: The temporary upload location [/tmp/tomcat.3709991203997752731.8765/work/Tomcat/localhost/ROOT] is not valid
	at org.apache.catalina.connector.Request.parseParts(Request.java:2821)
	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)
	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.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:834)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
	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)

后来经过一通百度显示得出了一个觉得可以一试还稍微稳妥的解决办法,重启!结果重启过后发现真的好了。但是并不清楚其中的原因,这并不是我的风格。于是我又看了一些资料,到最后得出了以下一些总结:

为什么出现此异常的原因
在Linux系统中,SpringBoot应用服务在启动(java -jar xxx.jar)的时候,会在操作系统的/tmp目录下生成几个临时目录
1、tomcat.*************.端口文件夹 (TODO:该文件夹用来做什么有待考察)
2、tomcat-docbase.***********.端口文件夹,对于Multipart(form-data)的方式处理请求时,会在操作系统的/tmp目录下生成`tomcat-文件目录,上传的文件先要转换成临时文件保存在这个文件夹下面。
划重点:而CentOS 7 会清理 10 天前的 /tmp 目录的文件。 SpringBoot 框架启动后,创建的 /tmp/tomcat.* 目录正好在清理策略内,所以会被自动清理。所以说如果项目启动后10天之内做的一些相关操作并不需要以上文件夹的支持,上述文件夹就会被干掉,等到一些操作需要上述相关文件夹时自然会找不到该文件夹然后抛出程序异常

解决方案
1.重启项目
2.创建报错信息中的临时文件夹:mkdir -p /tmp/tomcat.3709991203997752731.8765/work/Tomcat/localhost/ROOT
3.application.properties重新配置一个文件目录,然后重启项目存放Tomcat的日志、Dump等文件的临时文件夹,默认为系统的tmp文件夹server.tomcat.basedir=/data/apps/temp (个人认为这种方法才是长久之计)

发布了40 篇原创文章 · 获赞 10 · 访问量 4040

猜你喜欢

转载自blog.csdn.net/qq_41693150/article/details/103701154