接口请求报错:The temporary upload location[/tmp/tomcat.../work/Tomcat/] is not valid

问题背景

部署在linux服务上的java服务,接口调用突然不好使了,之前接口请求没有问题,突然报错了。
请求报错结果,如图示:image

原因

询问同事,得知缘由:是tomcat的临时目录被删除了

  1. SpringBoot项目在linux服务上启动后,centos系统默认会在 /tmp 目录下自动创建如下三个目录:
    hsperfdata_root
    tomcat.*.8765 (结尾的8765是服务的端口号)
    tomcat-docbase.
    .8765
    如图示:image
  2. 文件上传,Multipart(form-data)的方式处理请求时,默认就是在第二个目录下创建临时文件的(而我本次的接口刚好就是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天前的目录和文件

因此:
因为我的接口入参为form-data格式的,
而Multipart(form-data)的方式处理请求时,默认会在/tmp/tomcat.*******.8765目录下创建临时文件,
而刚好centos将/tmp目录下的临时文件给清除了,
所以接口请求报错

解决方法:

  1. 重启服务,服务重启后,/tmp目录下的临时文件则会自动创建;
  2. 修改tmp.conf配置文件,排除清除tomcat开头的配置文件,简单粗暴;
点击查看代码
x /tmp/tomcat.*
3. 通过SpringBoot启动配置注解(@Configuration) 指定自有上传文件目录
点击查看代码
@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();
    }
}
4. 在SpringBoot的配置之中设定Profile信息,原理类似方法3
点击查看代码
spring.mvc.static-path-pattern=/upload/**
spring.http.multipart.max-file-size=10MB
#指定上传文件临时目录
spring.http.multipart.location=/opt/data/upload
posted @   zlonger  阅读(1724)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示