记一次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

posted @ 2023-04-11 20:57  BUGMANWL  阅读(1222)  评论(0编辑  收藏  举报