接口请求报错:The temporary upload location[/tmp/tomcat.../work/Tomcat/] is not valid
问题背景
部署在linux服务上的java服务,接口调用突然不好使了,之前接口请求没有问题,突然报错了。
请求报错结果,如图示:
原因
询问同事,得知缘由:是tomcat的临时目录被删除了
- SpringBoot项目在linux服务上启动后,centos系统默认会在 /tmp 目录下自动创建如下三个目录:
hsperfdata_root
tomcat.*.8765 (结尾的8765是服务的端口号)
tomcat-docbase..8765
如图示: - 文件上传,Multipart(form-data)的方式处理请求时,默认就是在第二个目录下创建临时文件的(而我本次的接口刚好就是form-data的入参格式)
- 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天前的目录和文件
因此:
因为我的接口入参为form-data格式的,
而Multipart(form-data)的方式处理请求时,默认会在/tmp/tomcat.*******.8765目录下创建临时文件,
而刚好centos将/tmp目录下的临时文件给清除了,
所以接口请求报错
解决方法:
- 重启服务,服务重启后,/tmp目录下的临时文件则会自动创建;
- 修改tmp.conf配置文件,排除清除tomcat开头的配置文件,简单粗暴;
点击查看代码
x /tmp/tomcat.*
点击查看代码
@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();
}
}
点击查看代码
spring.mvc.static-path-pattern=/upload/**
spring.http.multipart.max-file-size=10MB
#指定上传文件临时目录
spring.http.multipart.location=/opt/data/upload
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY