Spring Boot Tomcat临时目录tmp抛错误异常

391 阅读1分钟

首先,我们应该知道,对于http POST请求来说,它需要使用这个临时目录来存储post数据。
其次,因为该目录是挂在到/temp目录下的临时文件,那么对于一些OS系统,像centOS将经常删除这个临时目录,所有导致该目录不存在了

解决方案

1.在application.yml文件中设置multipart location ,并重启项目

spring:
  http:
    multipart:
      location: /data/upload_tmp

2.在application.yml文件中设置

server
  tomcat:
     basedir: /tmp/tomcat

3.在配置文件添加bean

@Bean
public MultipartConfigElement multipartConfigElement() {
  MultipartConfigFactory factory = new MultipartConfigFactory();
  factory.setLocation("/tmp/tomcat");
  return factory.createMultipartConfig();
}

4.添加启动参数-java.tmp.dir=/path/to/application/temp/,并重启。

以上都是参考若依官网,但是有个缺点,异常的文件在临时目录就无法删除,所以我用的是下面的方式。

5.TomcatEmbeddedServletContainerFactory.setBaseDirectory(file);

@Configuration
public class TomcatConfig {
    private static final Log LOG = LogFactory.get();

    @Bean
    public TomcatEmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory factory = new MyTomcatEmbeddedServletContainerFactory();
        // 服务上下文配置
        // factory.setContextPath("/test");
        setBaseDirAndClean(factory);
        return factory;
    }

    // 指定内置tomcat的工作目录
    private void setBaseDirAndClean(
            TomcatEmbeddedServletContainerFactory factory) {
        File file = new File("./tomcat/laker/tmp");
        try {
            if (FileUtil.exist(file)) {
                List<File> files = FileUtil.loopFiles(file);
                if (CollUtil.isNotEmpty(files)) {
                    for (File delfile : files) {
                        delfile.delete();
                    }
                }
            } else {
                FileUtil.mkdir(file);
            }
        } catch (IORuntimeException e) {
            LOG.error(e);
        }
        factory.setBaseDirectory(file);
    }
}

参考: