天天看点

生产环境springboot项目上传文件突然失败

一、问题描述

 先截个图,问题一样的可以看下

生产环境springboot项目上传文件突然失败
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临时文件目录被删除,且删除的文件不可恢复,上传文件时获取不到文件目录,报错

三、解决方案:

  1.  根据日志的提示 在tmp路径下创建不存在的临时文件夹(开始用的这种方案解决)
  2.  进入到 /tmp路径下执行命令 mkdir -p tomcat.7572723224517022348.9001/work/Tomcat/localhost/ROOT
  3.  重启服务,临时方案:会重新生成tomcat目录,但是生产环境不建议如此操作;
  4.  增加服务配置,自定义baseDir:server.tomcat.basedir: /tmp/ticket (文件夹需要手动创建)  目前使用此方式,待验证
  5.  启动时增加参数-Djava.io.tmpdir=自定义目录(方法未验证)
  6.  修改tmpwatch 删除文件的逻辑,系统级别的命令,不建议操作
  7.  在网上看到有:编码的方式catch异常,生成删除的文件夹;(方法未验证)

参考:

https://github.com/spring-projects/spring-boot/issues/5009

https://github.com/spring-projects/spring-boot/issues/9616