项目场景:
Linux springboot上传文件报错:java.nio.file.NoSuchFileException: /tmp/undertowXXXXXX
Failed to parse multipart servlet request;
nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException:
/tmp/undertow.3701241699676381582.32711/undertow1504003900571732622upload
SpringBoot 文件上传接口,有时会报这个错误,但是服务重启后又不会出现这个问题。
原因分析:
查阅资料找到问题原因:
在 Linux 系统中,Spring Boot 应用以 java -jar 命令启动时,会在操作系统的 /tmp 目录下生成一个 tomcat(或 undertow )临时目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时 /tmp 目录下的文件,在长时间(10天)没有使用的情况下,系统执行了 tmp 目录清理服务(systemd-tmpfiles-clean.service),导致 /tmp/undertow…8090 文件被清理,然而在上传的时候,undertow 服务器需要创建/tmp/undertow…8090/undertow…upload 临时文件,但是调用 Files.createFile(…) 的时候就会发现找不到父目录,才导致了以上的错误。
解决方案:
有两种方式,一种是在 Java 启动命令中加入这个参数
-java.tmp.dir=/data/upload_tmp
或者在 Spring 配置文件applicaiton.yml(applicaiton.property) 中配置:
spring:
servlet:
multipart:
location: /data/tmp
手动指定目录后,必须保证该目录存在,并有读写的权限,创建该目录 mkdir -p /data/tmp