前言:运行了好久的一个系统springboot+undertow架构的,用户突然反馈文件上传出问题了,怀着不可能的心态看了下错误日志,提示有一个临时目录找不到NoSuchFileException: /tmp/undertow。于是度娘了下,发现了问题所在。
环境:Linux、springboot、undertow
问题:文件上传报错java.lang.RuntimeException: java.nio.file.NoSuchFileException: /tmp/undertow.1307744715448028781.4432/undertow5065267238966800211upload
at io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler.beginPart(MultiPartParserDefinition.java:261) ~[undertow-core-2.1.0.Final.jar:2.1.0.Final]
at io.undertow.util.MultipartParser$ParseState.headerName(MultipartParser.java:208) ~[undertow-core-2.1.0.Final.jar:2.1.0.Final]
at io.undertow.util.MultipartParser$ParseState.parse(MultipartParser.java:123) ~[undertow-core-2.1.0.Final.jar:2.1.0.Final]
at io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler.parseBlocking(MultiPartParserDefinition.java:232) ~[undertow-core-2.1.0.Final.jar:2.1.0.Final]
at io.undertow.servlet.spec.HttpServletRequestImpl.parseFormData(HttpServletRequestImpl.java:837) ~[undertow-servlet-2.1.0.Final.jar:2.1.0.Final]
at io.undertow.servlet.spec.HttpServletRequestImpl.getParameterMap(HttpServletRequestImpl.java:789) ~[undertow-servlet-2.1.0.Final.jar:2.1.0.Final]
错误原因
在Linux系统中,Spring Boot应用以java -jar命令启动时,会在操作系统的/tmp目录下生成一个tomcat(或undertow),上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时/tmp目录下的文件,在长时间(10天)没有使用的情况下,就会被系统机制自动删除掉。所以如果系统长时间没有使用到临时文件夹,就可能导致上面这个问题。
问题解决
修改配置文件application.properties,增加一项配置spring.servlet.multipart.location=/tmp/undertow