SpringBoot 上传文件错误java.io.IOException: The temporary upload location [/tmp/tomcat.88615151655.8007/work/Tomcat/localhost/ROOT] is not valid
转自:https://www.cnblogs.com/huyanlon/p/11818501.html
1、发现问题
Springboot项目(涉及到图片上传)
ServletFileUpload.isMultipartContent(request)
Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat/ocalhost/ROOT] is not valid
(1)SpringBoot项目启动后,系统默认会在 /tmp 目录下自动创建如下三个目录
hsperfdata_root,
tomcat.************.8080,(结尾是项目的端后)
tomcat-docbase.*********.8080
(2)、Multipart(form-data)的方式处理请求时,默认就是在第二个目录下创建临时文件的
(3)、CentOS7 定时清理临时文件目录
/tmp目录的清理规则主要取决于/usr/lib/tmpfiles.d/tmp.conf文件的设定,默认的配置内容为:
# Clear tmp directories separately, to make them easier to override v /tmp 1777 root root 10d # 清理/tmp下10天前的目录和文件 v /var/tmp 1777 root root 30d # 清理/var/tmp下30天前的目录和文件
依据以上几条情况,可以看得出我们上传文件的临时目录,在CentOS7之中,会每10天进行定时清理掉。于是就出现了文章开始出所说的出现上传文件的临时目录不存在,于是上传问题报错500的问题。
2、解决方案
2.1、直接修改CentOS清理临时目则录规直接暴力指定不清楚所有临时目录,精细化管理针对上传文件tomcat目录不进行清除。
/tmp目录的清理规则主要取决于/usr/lib/tmpfiles.d/tmp.conf文件的设定:
我们可以配置这个文件,比如你不想让系统自动清理/tmp下以tomcat开头的目录,那么增加下面这条内容到配置文件中即可:
x /tmp/tomcat.*
2.2、通过SpringBoot启动配置注解(@Configuration) 指定自有上传文件目录
改变临时文件的存储路径,指定自定义非CentOS7的系统默认临时目录,这样就可以避免系统在定时清除临时目录的情况。实现代码如下
@Configuration public class MultipartConfig { /** * 文件上传临时路径 */ @Bean MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); String location = System.getProperty("user.dir") + "/data/upload/tmp"; File tmpFile = new File(location); if (!tmpFile.exists()) { tmpFile.mkdirs(); } factory.setLocation(location); return factory.createMultipartConfig(); } }
2.3、原理类似第二种方案,但是在SpringBoot的配置之中设定Profile信息
在propertites/yaml文件中配置: spring.http.multipart.location = 你的缓存文件路径
#指定上传文件临时目录 spring.http.multipart.location = /opt/data/upload
spring:
http:
multipart:
location : /opt/data/upload