记一次java.nio.file.NoSuchFileException异常解决
项目场景:
线上环境做做数据导入操作
问题描述
项目中有一个上传文件的功能,在调用接口时,返回接口异常。
异常信息如下:
java.lang.RuntimeException: java.nio.file.NoSuchFileException: *************************** at io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler.beginPart(MultiPartParserDefinition.java:261) at io.undertow.util.MultipartParser$ParseState.headerName(MultipartParser.java:208) at io.undertow.util.MultipartParser$ParseState.parse(MultipartParser.java:123) at io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler.parseBlocking(MultiPartParserDefinition.java:232) at io.undertow.servlet.spec.HttpServletRequestImpl.parseFormData(HttpServletRequestImpl.java:857) at io.undertow.servlet.spec.HttpServletRequestImpl.loadParts(HttpServletRequestImpl.java:583) at io.undertow.servlet.spec.HttpServletRequestImpl.getParts(HttpServletRequestImpl.java:534) at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:95) ... 64 more Caused by: java.nio.file.NoSuchFileException: ******************************************
原因分析:
在 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(…) 的时候就会发现找不到父目录,才导致了以上的错误。
解决方案:
在项目中 applicaiton.yml 中添加配置 :
spring:
servlet:
multipart:
location: /home/tmp
手动指定目录后,必须保证该目录存在,并有读写的权限,创建该目录 mkdir -p /home/tmp