今天用户在生产环境上传文件时发生异常,用运维账号登进去也是一样报错,查询后台日志发现以下异常: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();
}
}