The temporary upload location xxx is not valid

SpringBoot搭建的应用,一直工作得好好的,春节后发现上传文件失败,提示

org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.6239989728636105816.19530/work/Tomcat/localhost/ROOT] is not valid

目录非法,实际查看目录,结果还真没有.

原因:

1.spring boot的应用服务在启动的时候,会在操作系统的/tmp目录下生成一个Tomcat.*的文件目录,用于"java.io.tmpdir"文件流操作

TomcatEmbeddedServletContainerFactory

2.程序对文件操作时:会生成临时文件,暂存在临时文件中。此处文件上传时,程序会先把上传的文件生成临时文件放在 [/tmp/tomcat.6239989728636105816.19530/work/Tomcat/localhost/ROOT]下,等文件存储到指定位置后再删除。

3.lunix 系统的tmpwatch 命令会删除10天未使用的临时文件;

长时间不操作,导致/tmp下面的tomcat临时文件目录被删除,且删除的文件不可恢复,上传文件时获取不到文件目录,从而报错。

解决方案:

1.重启服务,该方案是临时方案,治标不治本:会重新生成tomcat目录,但是生产环境不建议如此操作;

2.命令行生成对应目录,该方案也是临时方案,治标不治本;

3.增加服务配置,自定义baseDir:

一说启动时增加参数-Djava.io.tmpdir=自定义目录,一说是设置server.tomcat.basedir=自定义目录

这两种方法都未尝试

4.注入bean,手动配置临时目录

 

@Configuration
public class MultipartConfig {

    /**
     * 文件上传临时路径
     */
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();     //临时文件存放路径
        String location = System.getProperty("user.dir") + "/data/tmp";
        File tmpFile = new File(location);
        if (!tmpFile.exists()) {
            tmpFile.mkdirs();
        }
        factory.setLocation(location);
        return factory.createMultipartConfig();
    }
}

5.配置不删除tmp目录下的tomcat

vim /usr/lib/tmpfiles.d/tmp.conf

 

 # 添加一行

x /tmp/tomcat.*

 

https://blog.csdn.net/weixin_45623983/article/details/116000816

https://blog.csdn.net/weixin_37519463/article/details/116596253

https://www.cnblogs.com/h-java/p/10290612.html

posted @ 2023-01-30 11:20  RyderWang  阅读(73)  评论(0编辑  收藏  举报