项目场景:

Linux springboot上传文件报错:java.nio.file.NoSuchFileException: /tmp/undertowXXXXXX

  1. Failed to parse multipart servlet request;
  2. nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException:
  3. /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 启动命令中加入这个参数

  1. -java.tmp.dir=/data/upload_tmp

或者在 Spring 配置文件applicaiton.yml(applicaiton.property) 中配置:

  1. spring:
  2. servlet:
  3. multipart:
  4. location: /data/tmp

手动指定目录后,必须保证该目录存在,并有读写的权限,创建该目录 mkdir -p /data/tmp