Spring Boot 上传文件找不到临时目录

求知探索 1年前 ⋅ 894 阅读

日志信息

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天)没有使用的情况下,就会被系统机制自动删除掉。所以如果系统长时间没有使用到临时文件夹,就可能导致上面这个问题。

解决办法

方法一

若使用的是TomcatUndertow无效),可使用以下配置。

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

 


全部评论: 0

    我有话说: