今天用户在生产环境上传文件时发生异常,用运维账号登进去也是一样报错,查询后台日志发现以下异常:org.springframework.web.multipart.MultipartException:Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/bes.8086.14761554047459948324/work/BES/server/ROOT] is not valid

问题复现

当系统中有enctype=”multipart/form-data”文件上传接口时,会自动将文件缓存到本地临时文件夹/tmp/xxx中,而liunx有一个文件位于/usr/lib/tmpfiles.d/tmp.conf,里面有一段内容是这样的

v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

也就是说/tmp底下的所有文件和文件夹,如果超过10天没有任何改动那么就会自动删除,导致文件上传无法读取到缓存目录导致报错。

问题处理

添加运行时参数

可以在java -jar启动脚本到后面添加-Djava.io.tmpdir= 来自定义文件上传的缓存目录

添加配置文件参数

我们也可以在yml配置文件中添加以下参数:

spring:
  servlet:
    multipart:
      location: /backend/tmp

注意:对应目录的文件夹需要自己创建好,否则还是会报错

添加Config配置类

@Configuration
public class MultipartConfig {
    /**
     * 文件上传临时路径
     */
    @Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("/tmp");
    return factory.createMultipartConfig();
}
}