我们使用了SpringCloud 进行项目开发,其中一个主要服务(涉及到图片上传)的SpringBoot微服务在测试环境之中。发现上传图片上传接口报错500啦。本人在后端日志目录之中也无法查找到报错信息。仅仅只有前后端分离的前端调用接口的时候返回一个如下错误提示
The temporary upload location [/tmp/tomcat.xxxx.xxxx/work/Tomcat/localhost/ROOT] is not valid
最后我根据错误提示搜索一下,结果发现是tomcat的临时目录被删除了。最后找到一篇文章说得比较清楚有如下几点:
(1)、SpringBoot项目启动后,系统默认会在 /tmp 目录下自动创建如下三个目录
hsperfdata_root,
tomcat.************.8080,(结尾是项目的端后)
tomcat-docbase.*********.8080
(2)、Multipart(form-data)的方式处理请求时,默认就是在第二个目录下创建临时文件的
(3)、CentOS7 定时清理临时文件目录
/tmp目录的清理规则主要取决于/usr/lib/tmpfiles.d/tmp.conf文件的设定,默认的配置内容为:
# Clear tmp directories separately, to make them easier to override v /tmp 1777 root root 10d # 清理/tmp下10天前的目录和文件 v /var/tmp 1777 root root 30d # 清理/var/tmp下30天前的目录和文件
2、三种解决方案
2.1、直接修改CentOS清理临时目则录规 直接暴力指定不清楚所有临时目录,精细化管理针对上传文件tomcat目录不进行清除。
/tmp目录的清理规则主要取决于/usr/lib/tmpfiles.d/tmp.conf文件的设定:
我们可以配置这个文件,比如你不想让系统自动清理/tmp下以tomcat开头的目录,那么增加下面这条内容到配置文件中即可:
x /tmp/tomcat.*
2.2、通过SpringBoot启动配置注解(@Configuration) 指定自有上传文件目录
改变临时文件的存储路径,指定自定义非CentOS7的系统默认临时目录,这样就可以避免系统在定时清除临时目录的情况。实现代码如下
@Configuration
public class MultipartConfig {
/**
* 文件上传临时路径
*/
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
String location = System.getProperty("user.dir") + "/data/upload/tmp";
File tmpFile = new File(location);
if (!tmpFile.exists()) {
tmpFile.mkdirs();
}
factory.setLocation(location);
return factory.createMultipartConfig();
}
}
2.3、原理类似第二种方案,但是在SpringBoot的配置之中设定Profile信息
在propertites/yaml文件中配置: spring.http.multipart.location= 你的缓存文件路径
spring.mvc.static-path-pattern=/upload/** spring.http.multipart.max-file-size=10MB #指定上传文件临时目录 spring.http.multipart.location=/opt/data/upload


![【报错】[/tmp/tomcat.xxxx.xxxx/work/Tomcat/localhost/ROOT] is not val 【报错】[/tmp/tomcat.xxxx.xxxx/work/Tomcat/localhost/ROOT] is not val](http://www.mshxw.com/aiimages/31/592514.png)
