报错信息:
Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608.8090/work/Tomcat/localhost/ROOT] is not valid
显示[/tmp/tomcat.1428942566812653608.8090/work/Tomcat/localhost/ROOT]找不到。
原因
我在上传文件时系统提示出现错误,是因为centos对临时文件有自动清理规则,如果较长时间(默认10天)没有使用,就会将这个目录给清理掉,就导致我们上面的问题出现导致上传失败。
分析:
-
首先,我们应该知道,对于http POST请求来说,它需要使用这个临时目录来存储post数据。
-
其次,因为该目录是挂在到/temp目录下的临时文件,那么对于一些OS系统,像centOS将经常删除这个临时目录,所有导致该目录不存在了。
验证是否是这个原因:
首先进入服务器查看是否存在这个目录
解决方案
- 重启项目,但是不能从根源上解决问题,如果长时间不使用(时间是根据centos定义的规则进行清理)仍然会被清理出现这个问题。
- 修改application.yml配置文件
第一种:
spring:
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 上传文件的中间位置
location: /alited/uploadPath
第二种
server:
tomcat:
#设定tomcat的basedir目录,如果没有指定则使用临时目录
basedir: /home/app/tomcat_upload_temp
当然这里这个目录必须是存在的,
Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [D:\alited\uploadPath\tmp] is not valid
如果不存在仍然会报上面的错误,只不过路径变化了而已,因此可以在启动类下面增加一个配置用来自动创建目录。
public class StartApplication
{
@Value("${spring.servlet.multipart.location}")
private String tempDir;
public static void main(String[] args)
{
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(StartApplication.class, args);
}
/**
* 配置用来自动创建目录用来指定上传中间目录
*/
@Bean("mkdir")
public void mkDir(){
File file = new File(tempDir);
// 判断文件夹是否存在
if (!file.exists()){
//创建文件夹
file.mkdirs();
}
}
}