The temporary upload location xxx is not valid
SpringBoot搭建的应用,一直工作得好好的,春节后发现上传文件失败,提示
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.6239989728636105816.19530/work/Tomcat/localhost/ROOT] is not valid
目录非法,实际查看目录,结果还真没有.
原因:
1.spring boot的应用服务在启动的时候,会在操作系统的/tmp目录下生成一个Tomcat.*的文件目录,用于"java.io.tmpdir"文件流操作
TomcatEmbeddedServletContainerFactory
2.程序对文件操作时:会生成临时文件,暂存在临时文件中。此处文件上传时,程序会先把上传的文件生成临时文件放在 [/tmp/tomcat.6239989728636105816.19530/work/Tomcat/localhost/ROOT]下,等文件存储到指定位置后再删除。
3.lunix 系统的tmpwatch 命令会删除10天未使用的临时文件;
长时间不操作,导致/tmp下面的tomcat临时文件目录被删除,且删除的文件不可恢复,上传文件时获取不到文件目录,从而报错。
解决方案:
1.重启服务,该方案是临时方案,治标不治本:会重新生成tomcat目录,但是生产环境不建议如此操作;
2.命令行生成对应目录,该方案也是临时方案,治标不治本;
3.增加服务配置,自定义baseDir:
一说启动时增加参数-Djava.io.tmpdir=自定义目录,一说是设置server.tomcat.basedir=自定义目录
这两种方法都未尝试
4.注入bean,手动配置临时目录
@Configuration public class MultipartConfig { /** * 文件上传临时路径 */ @Bean MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //临时文件存放路径 String location = System.getProperty("user.dir") + "/data/tmp"; File tmpFile = new File(location); if (!tmpFile.exists()) { tmpFile.mkdirs(); } factory.setLocation(location); return factory.createMultipartConfig(); } }
5.配置不删除tmp目录下的tomcat
vim /usr/lib/tmpfiles.d/tmp.conf
# 添加一行
x /tmp/tomcat.*
https://blog.csdn.net/weixin_45623983/article/details/116000816
https://blog.csdn.net/weixin_37519463/article/details/116596253