日志信息
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException: /tmp/undertow.1942731200127854712.9999/undertow6409253598725145197upload
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:523)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:590)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
错误原因
在Linux
系统中,Spring Boot
应用以java -jar
命令启动时,会在操作系统的/tmp
目录下生成一个tomcat*
(或undertow*
),上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时/tmp
目录下的文件,在长时间(10
天)没有使用的情况下,就会被系统机制自动删除掉。所以如果系统长时间没有使用到临时文件夹,就可能导致上面这个问题。
解决办法
方法一
若使用的是Tomcat
(Undertow
无效),可使用以下配置。
server:
tomcat:
basedir: /data/app
方法二
使用命令行配置-Djava.io.tmpdir = /xxx
。
Undertow无效,临时目录未改变,仍是/tmp下。
nohup java -jar -XX:+UseG1GC app.jar --spring.profiles.active=test -Djava.io.tmpdir=/data/app >/dev/null 2>&1 &
方法三
使用配置类配置。(方法四配置文件方式底层也是使用此方法)
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/data/app");
return factory.createMultipartConfig();
}
方法四(推荐)
applicaiton.yml
(applicaiton.property
)
spring.servlet.multipart.location
底层就是createMultipartConfig
中的factory.setLocation
org.springframework.boot.autoconfigure.web.servlet.MultipartProperties#createMultipartConfig
spring:
servlet:
multipart:
location: /data/app
注意:本文归作者所有,未经作者允许,不得转载