文件上传出错Failed to parse multipart servlet request

报错信息:

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天)没有使用,就会将这个目录给清理掉,就导致我们上面的问题出现导致上传失败。

分析:

  1. 首先,我们应该知道,对于http POST请求来说,它需要使用这个临时目录来存储post数据。

  2. 其次,因为该目录是挂在到/temp目录下的临时文件,那么对于一些OS系统,像centOS将经常删除这个临时目录,所有导致该目录不存在了。

验证是否是这个原因:
首先进入服务器查看是否存在这个目录

解决方案

  1. 重启项目,但是不能从根源上解决问题,如果长时间不使用(时间是根据centos定义的规则进行清理)仍然会被清理出现这个问题。
  2. 修改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(); 
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41596778/article/details/128866132