首先,我们应该知道,对于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);
}
}
参考:
- https://doc.ruoyi.vip/ruoyi/other/faq.html#tomcat%E4%B8%B4%E6%97%B6%E7%9B%AE%E5%BD%95tmp%E6%8A%9B%E9%94%99%E8%AF%AF%E5%BC%82%E5%B8%B8