記一次java.nio.file.NoSuchFileException異常解決
項(xiàng)目場(chǎng)景:
線上環(huán)境做做數(shù)據(jù)導(dǎo)入操作
問(wèn)題描述
項(xiàng)目中有一個(gè)上傳文件的功能,在調(diào)用接口時(shí),返回接口異常。
異常信息如下:
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 系統(tǒng)中,Spring Boot 應(yīng)用以 java -jar 命令啟動(dòng)時(shí),會(huì)在操作系統(tǒng)的 /tmp 目錄下生成一個(gè) tomcat(或 undertow )臨時(shí)目錄,上傳的文件先要轉(zhuǎn)換成臨時(shí)文件保存在這個(gè)文件夾下面。由于臨時(shí) /tmp 目錄下的文件,在長(zhǎng)時(shí)間(10天)沒(méi)有使用的情況下,系統(tǒng)執(zhí)行了 tmp 目錄清理服務(wù)(systemd-tmpfiles-clean.service),導(dǎo)致 /tmp/undertow…8090 文件被清理,然而在上傳的時(shí)候,undertow 服務(wù)器需要?jiǎng)?chuàng)建/tmp/undertow…8090/undertow…upload 臨時(shí)文件,但是調(diào)用 Files.createFile(…) 的時(shí)候就會(huì)發(fā)現(xiàn)找不到父目錄,才導(dǎo)致了以上的錯(cuò)誤。
解決方案:
在項(xiàng)目中 applicaiton.yml 中添加配置 :
spring:
servlet:
multipart:
location: /home/tmp
手動(dòng)指定目錄后,必須保證該目錄存在,并有讀寫(xiě)的權(quán)限,創(chuàng)建該目錄 mkdir -p /home/tmp
浙公網(wǎng)安備 33010602011771號(hào)