springboot上传文件临时文件夹找不到不能成功上传问题
SpringBoot文件上传NoSuchFileException: /tmp/undertow等错误
错误信息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
更多推荐
所有评论(0)