事情原因是早期文件上传,有段时间报错!重启项目反而恢复正常。
百度搜索发现原因都一致。
内置的tomcat需要创建临时目录来存放上传的文件, Linux系统中默认建在/tmp目录下, 10天期间,如果没有上传文件的需求,那这个路径就会被linux清除
测试环境服务器上截图
/tmp
是临时目录,tomcat.7044303375738389991.8005
是Tomcat服务器的实例标识,work
是Tomcat工作目录的子目录,Tomcat/localhost/ROOT
是特定web应用(通常是根应用)的工作目录。
1.重启项目,临时操作——不建议,只是救场
2.把不想要被删除的tomcat
临时文件追加到配置文件tmp.conf
vim /usr/lib/tmpfiles.d/tmp.conf
# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp
# 在这里添加 x /tmp/tomcat.*
~
3.添加启动参数,指定临时目录 未测试
java -Djava.io.tmpdir=/usr/tomcat/xx -jar xx_uat.jar
4.注入Bean,手动配置@Bean MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); String location = System.getProperty("user.dir") + "/data/upload_tmp"; # log.info("======>{}",location); # File tmpFile = new File(location); # if (!tmpFile.exists()) { # tmpFile.mkdirs(); # } factory.setLocation(location); return factory.createMultipartConfig(); }
@Component
@Log4j2
//@Order(3) 当另一个 AplicationRunner接口被实现,功能类似 此接口标识 执行优先级,数字小先执行
public class WpsInitApplication implements CommandLineRunner {
@Value("${upload.file.savepath}")
String uploadPath;
@Value("${upload.file.temporary}")
String temporaryUploadPath;
@Override
public void run(String... args) {
WdztAppInfoConfig.uploadPath = uploadPath;
WdztAppInfoConfig.temporaryUploadPath=temporaryUploadPath;
String path=System.getProperty("user.dir")+uploadPath;
String temporaryPath=System.getProperty("user.dir")+temporaryUploadPath;
File folder = new File(path);
File temporaryFolder = new File(temporaryPath);
log.info("真实的上传路径:{}",folder.getAbsolutePath());
if(!folder.isDirectory()){
folder.mkdirs();
}
if(!temporaryFolder.isDirectory()){
temporaryFolder.mkdirs();
}
WdztAppInfoConfig.uploadPath = folder.getAbsolutePath();
WdztAppInfoConfig.temporaryUploadPath=temporaryFolder.getAbsolutePath();
}
}
@Component
@Log4j2
public class AppStartRunner implements ApplicationRunner {
@Autowired
RedisCacheUtil redisCacheUtil;
@Override
public void run(final ApplicationArguments args) throws Exception {
log.info("项目启动完成");
log.info("清理微信上次的key");
redisCacheUtil.deleteData(WEI_XIN_KEY);
}
}
@Component
public class TestUpload implements InitializingBean {
@Override
public void afterPropertiesSet() {
String location = System.getProperty("user.dir") + "/data/upload_tmp";
File testFileDir= new File(location );
log.info("真实的上传路径:{}",testFileDir.getAbsolutePath());
if(!testFileDir.isDirectory()){
testFileDir.mkdirs();
}
}
}
注意:File.separator 分隔符
在 windows 中 文件文件分隔符 用 ' \ ' 或者 ' / ' 都可以
在 Linux 中,是不识别 ' \ ' 的, File.separator 是系统默认的文件分隔符号,此字段的值为 ' / '
System.getProperty(“user.dir“),文件上传、下载临时文件地址
user.home |
用户的主目录 不变化 在Unix/Linux系统中,主目录通常是 |
user.dir |
用户的当前工作目录 会变化 程序启动时所在的目录;通常是启动命令所在的目录 |
看概念察觉不到变化,直接代码展示结果区分不同:
你的项目 xx.jar包代码中含System.getProperty(“user.dir”)方法
> pwd
> /home # home文件夹下
> java -jar /home/test/xx.jar
控制台输出: /home
> pwd
> /home/xiaoming # xiaoming文件夹下
> java -jar /home/test/xx.jar
控制台输出: /home/xiaoming
注意点:运行java程序的时候要统一在某个路径下执行,否则影响文件上传、下载或者涉及临时文件路径的代码【springboot中设置文件配置时,相对路径默认在user.dir 后 {及jar包所在目录下}】