日常問題:上傳接口報錯
項目啓動後,一段時間沒怎麼用之後,系統所有上傳接口都失敗,報錯爲接口異常。
這個問題通常不會出現的,因爲正常情況下使用,不可能會有7天不進行文件上傳操作的。
因爲財務上傳報表是每個工作日的啊 ╮(╯_╰)╭
結果碰到了國慶春節長假,還有今年疫情的超級長假。然後就炸了 ε=(´ο`*)))唉
問題
Springboot上傳文件錯誤:org.springframework.web.multipart.MultipartException
....
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.8514542127953693245.8091/work/Tomcat/localhost/ROOT] is not valid
....
原因
linux系統會定期(10天)清除tmp目錄下沒有使用過的文件,springBoot啓動的時候會在/tmp目錄下生成一個tomcat.****.port(tomcat.8514542127953693245.8091)的文件目錄,此目錄要是清除後,就是出現上傳文件錯誤!
具體清除腳本詳情:
從/var/log/cron 日誌中發現,服務器除了調用用戶的計劃任務外,還會執行系統自己的.
進入 /etc/cron.daily , 可以看到一個tmpwatch
裏面調用了/usr/sbin/tmpwatch 腳本 參數爲240 =10*24 =10天
解決
第一種臨時方法,萬能的重啓。臨時文件會重新生成。
第二種方法,重啓,並且調整系統清理的時長,把上文原因中提到的腳本時間延長到100+天。【要是幾百天都不用的系統,也就不用維護啦 罒ω罒】
第三種方法,項目配置Bean,提供臨時文件目錄
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//單個文件最大
factory.setMaxFileSize("10240KB");
/// 設置總上傳數據總大小
factory.setMaxRequestSize("102400KB");
// 這種寫法在linux下是沒問題的,但是開發windows上會找不到目錄
// factory.setLocation("/var/tmp");
// 由於默認/tmp 臨時目錄下 Linux 會清理7天無操作目錄,所以換個上傳目錄試試
String location = System.getProperty("user.home") + "/data/tmp";
File tmpFile = new File(location);
if (!tmpFile.exists()) {
tmpFile.mkdirs();
}
factory.setLocation(location);
return factory.createMultipartConfig();
}
參考文檔
就這個了,很詳細的:https://blog.csdn.net/liuxiaoming1109/article/details/93467180
這個是linux下文件自動刪除的文章:https://www.tuicool.com/articles/6Jj6rq
小杭 2020-02-19 (:з」∠)