SpringBoot上傳臨時文件被刪除引起報錯的解決

上傳臨時文件被刪除引起報錯的解決

1.前言

在項目中使用到瞭SpringBoot的上傳實現瞭一個excel導入功能,上線後穩得一批,但突然有一天發現,導入失敗報錯:

location [/tmp/tomcat.xxx.8551/work/Tomcat/localhost/ROOT] is not valid

詳見如圖

image.png

2.問題分析

在SpringBoot項目啟動後,系統會在‘/tmp’目錄下自動的創建以下幾個文件;

  • hsperfdata_root
  • tomcat.************.8080,(結尾為端口)
  • tomcat-docbase.*********.8080 ;

程序對上傳文件操作時,會生成臨時文件,暫存在臨時文件目錄中,經查閱資料發現CentOS有自動清理規則,系統會對/tmp下10天未使用的文件進行清理,清理後再次使用文件上傳就會出現以上問題 ;

3.解決方案

3.1重啟項目

啟動時會自動新建臨時目錄的。但是以後依舊會有被系統自動清除的可能(未徹底解決)。

3.2自定義臨時文件路徑

新增如下配置

server.tomcat.basedir=/home/dev/temp

註意事項:

  • 需要重啟項目生效 ;
  • 若啟動項目的用戶有權限在該目錄下創建文件夾,則會自動創建 ;

3.2新增配置

配置類方式指定臨時文件路徑

@Configuration
public class MultipartConfig {
    /**
     * 文件上傳臨時路徑
     */
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        String location = System.getProperty("user.dir") + "/dev/temp";
        File tmpFile = new File(location);
        if (!tmpFile.exists()) {
            tmpFile.mkdirs();
        }
        factory.setLocation(location);
        return factory.createMultipartConfig();
    }
}

文件上傳提示臨時文件夾不存在

1.異常信息

java.io.IOException: The temporary upload location [C:\Users\Administrator\AppData\Local\Temp\tomcat.1668302398522753093.8383\work\Tomcat\loca lhost\ROOT] is not valid

2.原因

文件上傳臨時上傳文件夾失效瞭,可能是系統清除瞭臨時目錄。

3.解決方法

1.重啟服務,不建議在生產環境使用。

2.增加服務配置,自定義baseDir。

server.tomcat.basedir=/tmp/tomcat

3.註入bean,手動配置臨時目錄,建議有項目組統一配置,便於管理和錯誤定位。

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

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: