一、问题描述
先截个图,问题一样的可以看下
2019-04-25 12:06:39,441:ERROR http-nio-9001-exec-6 (GlobalExceptionHandler.java:71) - {}
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.7572723224517022348.9001/work/Tomcat/localhost/ROOT] is not valid
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.handleParseFailure(StandardMultipartHttpServletRequest.java:123) ~[spring-web-5.1.2.RELEASE.jar!/:5.1.2.RELEASE]
。。。。。。。。。。。。
Caused by: java.io.IOException: The temporary upload location [/tmp/tomcat.7572723224517022348.9001/work/Tomcat/localhost/ROOT] is not valid
at org.apache.catalina.connector.Request.parseParts(Request.java:2821) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12]
at org.apache.catalina.connector.Request.parseParameters(Request.java:3185) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12]
at org.apache.catalina.connector.Request.getParameter(Request.java:1116) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12]
at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84) ~[spring-web-5.1.2.RELEASE.jar!/:5.1.2.RELEASE]
... 26 more
二、原因:
1.spring boot的应用服务在启动的时候,会生成在操作系统的/tmp目录下生成一个Tomcat.*的文件目录,用于"java.io.tmpdir"文件流操作TomcatEmbeddedServletContainerFactory
2.程序对文件的操作时:会生成临时文件,暂存在临时文件中;
lunix 系统的tmpwatch 命令会删除10天未使用的临时文件;
长时间不操作,导致/tmp下面的tomcat临时文件目录被删除,且删除的文件不可恢复,上传文件时获取不到文件目录,报错
三、解决方案:
- 根据日志的提示 在tmp路径下创建不存在的临时文件夹(开始用的这种方案解决)
- 进入到 /tmp路径下执行命令 mkdir -p tomcat.7572723224517022348.9001/work/Tomcat/localhost/ROOT
- 重启服务,临时方案:会重新生成tomcat目录,但是生产环境不建议如此操作;
- 增加服务配置,自定义baseDir:server.tomcat.basedir: /tmp/ticket (文件夹需要手动创建) 目前使用此方式,待验证
- 启动时增加参数-Djava.io.tmpdir=自定义目录(方法未验证)
- 修改tmpwatch 删除文件的逻辑,系统级别的命令,不建议操作
- 在网上看到有:编码的方式catch异常,生成删除的文件夹;(方法未验证)
参考:
https://github.com/spring-projects/spring-boot/issues/5009
https://github.com/spring-projects/spring-boot/issues/9616