1. 程式人生 > >spring Boot 上傳檔案,10天后,不能上傳的bug

spring Boot 上傳檔案,10天后,不能上傳的bug

  1. 起因 

             公司研發人員 部署服務在阿里雲 ecs 伺服器; 上傳檔案過1周左右檔案自動丟失;

  2. 排查思路:

        (1).查詢tomcat 啟動日誌出現如下資訊:

              java.io.IOException: The temporary upload location [/tmp/tomcat.1593253653386650830.8220/work/Tomcat/localhost/ROOT] is not valid

       (2).這個目錄在Linux系統中預設建在/tmp目錄下, 10天就會被清除, 引發上述異常.  

     (3).man systemd-tmpfiles 

      

  圖片.png

   

(3).由此可確定服務為凶手;就是說/tmp 目錄下除了下面排除的檔案,都給刪了。擦~

 

  1.     

        系統環境:

                       Centos-7.2 

           核心版本:  

                       2.6.32-696.3.2.el6.x86_64

           容器:

                         Tomcat 8.5.15.tar.gz    

          

 

2.tomcat 服務層解決辦法;

 

JVM_OPTIONS="-Xrs -Xms256m -Xmx512m -Djava.io.tmpdir=/data/app/upload"   ####tomcat bin catalina.sh 檔案修改##
 

 

3.程式框架解決辦法:

 

框架配置檔案新增: application.properties     ####sprint-boot 框架配置檔案#######

server.tomcat.basedir=/data/app/upload
 

4.系統解決方案;

解決方案在 /usr/lib/tmpfiles.d/ 新建檔案把指定目錄新增上並規定不讓被清除
[email protected]~:# vi /usr/lib/tmpfiles.d/tomcat.conf
d /tmp/tomcat* 0755 root root -            
d /tmp/upload  0755 root root -             ##tomcat 程式上傳目錄檔案

 

OK,重啟 systemctl restart systemd-tmpfiles-clean  服務;

 

 

----------------------------------------------------------------------------------------

線上的系統中不能上傳檔案了,出現如下錯誤:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request;nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/localhost/ROOT] is not valid org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:112) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.
1
原因:
在linux系統中,springboot應用服務再啟動(java -jar 命令啟動服務)的時候,會在作業系統的/tmp目錄下生成一個tomcat*的檔案目錄,上傳的檔案先要轉換成臨時檔案儲存在這個資料夾下面。由於臨時/tmp目錄下的檔案,在長時間(10天)沒有使用的情況下,就會被系統機制自動刪除掉。所以如果系統長時間無人問津的話,就可能導致上面這個問題。

解決辦法:
在 yml配置檔案 中新增:

server.tomcat.basedir: /data/apps/temp
1
手動的將臨時資料夾設定為自定義的資料夾,就不會被Linux刪除了。

ps:在windows系統中可以生效,系統會自動生成/data/apps/temp這一路徑,但是在Linux系統中不會生成/data/apps/temp路徑。tell me why?…