错误信息1:org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1220970741172837513.8080/work/Tomcat/localhost/ROOT] is not valid at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:111)

错误信息2:Failed to parse multipart servlet request;
nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException:
/tmp/undertow.3701241699676381582.32711/undertow1504003900571732622upload

原因分析:
        1、Tomcat在上传文件的时候,会先将文件上传至临时文件夹(默认情况下,tomcat 启动的时候会在 tmp 下 进行初始化临时文件夹,如果上传文件没有指定临时文件夹的位置,这个时候默认为Tomcat 的基本工作路径),由于Linux系统会定期对 tmp下的文件夹进行清除,当一旦这个目录被系统清除掉,在上传文件的时候就会导致找不到路径而报错。
注:Tomcat 在启动的时候根据 server.tomcat.basedir 指定的值(默认 tmp )下初始化 tomcat.xxxxx(上传文件临时路径);默认我们可以在tmp 下面看到很多这样的tomcat 开头的临时文件夹

         2、通过spring boot MultipartFile上传文件时,spring boot默认配置会在/tmp下创建undertow的目录,来存放中途临时上传的文件,当上传完成后将/tmp中的文件清理,但在实际工作中,一台服务器的/tmp往往很小,且一台服务器上搭载了很多应用就很容易出现磁盘空间不足的情况

Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.io.IOException: No space left on device

方案1:

在SpringBoot项目中,配置spring.http.multipart.location可以指定上传文件的临时路径。

但是,SpringBoot版本不同,关于这一块的配置也不相同。

1、Spring Boot 1.3 版本:

  multipart.location=/data/tmp

2、Spring Boot 1.4 版本和 1.5 版本:

  spring.http.multipart.location=/data/tmp

3、Spring Boot 2.0 版本:

  spring.servlet.multipart.location=/data/tmp

以上,要注意1.4、1.5版本和2.0版本的区别,不然会不起作用。

方案2:

使用配置类配置

public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation(System.getProperty("/data/tmp"));
    return factory.createMultipartConfig();
}

方案3

在java启动命令中加入这个参数

-java.tmp.dir=/data/tmp

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐