项目启动时做一些操作/业务

事情起因

事情原因是早期文件上传,有段时间报错!重启项目反而恢复正常。 

百度搜索发现原因都一致。

内置的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();
    }

另一种项目启动后进行扩展 具体代码自己看需求改动

1.实现 CommandLineRunner 

@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();
    }
}

2.实现 ApplicationRunner 

@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);
    }
}

3.实现InitializingBean接口

@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

用户的主目录  不变化
Windows系统中,主目录通常是C:\Users\用户名

Unix/Linux系统中,主目录通常是/home/用户名

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命令的路径有关系

注意点:运行java程序的时候要统一在某个路径下执行,否则影响文件上传、下载或者涉及临时文件路径的代码【springboot中设置文件配置时,相对路径默认在user.dir 后 {及jar包所在目录下}】

 

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值