天天看點

Springboot上傳檔案臨時目錄無效

       一個奇葩問題,雖然解決了,但還是沒弄清楚,小記一筆。

       年後回來,測試人員對年前的3次疊代的功能進行了回歸測試,然後發現所有excel導入的功能都失效了。作為背景開發人員,當然是第一時間打開運作日志排查原因啦。但奇怪的是,背景日志中并沒有ERROR資訊......于是乎轉戰到前端,通過chrome的開發工具發現如下異常:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.439562935221680911.8769/work/Tomcat/localhost/ROOT] is not valid org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:112) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:86)

.......

        從異常資訊來看,其實不難了解,就是上傳檔案的臨時目錄失效了,百度以後确實如此。但是為什麼過完年回來目錄就突然失效了呢?

        繼續查詢相關資料後了解到,springboot啟動時會建立一個用于上傳檔案的臨時目錄,而系統會在10天後自動清除該目錄。

解決方法:

1、重新開機服務,重新生成目錄;

2、手動建立該目錄;

3、在啟動服務的main方法中,添加以下代碼,指定上傳檔案的目錄:

@Bean

MultipartConfigElementmultipartConfigElement() {

MultipartConfigFactory factory =new MultipartConfigFactory(); 

factory.setLocation("/data/apps/temp"); 

return factory.createMultipartConfig();

}

4、在應用的配置檔案中添加以下配置,原理同3:

server:

    tomcat:

        basedir: /data/apps/temp

        實踐證明,以上方法都沒有解決我的問題...

        接着,我進入到伺服器的tmp目錄,發現裡面已經建立了多個tomcat的臨時檔案,看日期應該是我多次重新開機産生的。那麼正常情況下,解決方法1應該已經生效了(雖然不能永久性解決這個問題),為什麼還是報異常呢?令人蛋疼的是,新建立的臨時目錄的端口都是8491,就是我重新開機的服務的端口,但是異常中的臨時目錄端口是8769,而8769正是zuul網關的端口。于是,我在zuul的配置檔案裡加上了解決方法4的配置資訊,果然就好了...

        令我不解的是,如果是zuul的問題,那麼一開始應該就無法上傳,而不會等到年後才出現問題。

檔案位址:https://www.jianshu.com/p/cfbbc0bb0b84

繼續閱讀