接口请求报错: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 @ 2022-12-29 16:08  zlonger  阅读(1890)  评论(0)    收藏  举报