Tomcat臨時目錄及java.io.tmpdir對應的目錄


最近客戶現場的技術支持接連反饋了一個問題:導入數據的時候,上傳的excel會在服務器上生成一個臨時文件,而這個臨時文件都在  tomcat 的安裝目錄下,如果上傳次數比較多的話,就會導致tomcat安裝目錄下有多個臨時的excel文件,很不合理也不美觀,如下圖:

 

接到這個問題,第一反應是  java.io.tmpdir 這個系統配置沒指定好,因為做上傳的時候,是通過  

System.getProperty("java.io.tmpdir");

這種方式來獲取臨時目錄,然后把文件放到臨時目錄里去的,按說這些臨時文件都應該在 tomcat 安裝目錄下的 temp 文件夾里,因為這個是tomcat的臨時目錄,但現在卻沒有,所以懷疑是 java.io.tmpdir 這個系統變量沒指定好。

之后就開始了各種查找資料,百度查完了查搜狗,搜狗查完了查Stack Overflow,但並沒有得到想要的答案,所有的文件都是告訴你臨時文件目錄在哪,當然也查到了如果去設置這個 java.io.tmpdir ,通過下面的方式:

  java -Djava.io.tmpdir=/path/to/tmpdir 

但實際在linux服務器上執行的時候,發現這個命令根本無法執行,查了 Stack Overflow 才知道,這個命令后面還需要跟一個有 main 方法的Java類才行,但這顯然是行不通的,也跟我想象中的設置java.io.temdir屬性的方式不一樣,只能接着查資料。

查了半天,也沒什么收獲,問題始終沒解決,最后,打印了一下程序執行時取到的  java.io.tmpdir 對應的目錄,才知道問題在哪,代碼如下:

先看一下打印結果:

可以看出來,程序運行時取到的  java.io.tmpdir 的值是完全正確的,對應的就是tomcat安裝目錄下的 temp 文件夾

再看日志打印下面的代碼,原來我在拼接文件完整路徑的時候,在臨時目錄和文件名之間沒有加  /  ,導致拼接出來的臨時文件是這樣的地址:

  /iflytek/apache-tomcat-9155/tempff9d68f1-9548-437f-a3e1-0ed93647392c_test.xlsx

也就是臨時目錄的 temp 和文件名連一塊了,結果自然而然的就是,臨時文件被上傳到了 /iflytek/apache-tomcat-9155/  這個tomcat的安裝目錄下,導致了最開始的問題。

問題到這是解決了,但在查資料的過程中,知道了很多新的知識。

 

在  tomcat 安裝目錄下的  bin/catalina.sh 這個命令里指定了 tomcat 的臨時目錄,而在程序中通過 

System.getProperty("java.io.tmpdir");

取系統的臨時目錄的時候,取的就是 tomcat 的臨時目錄,也就是 tomcat  安裝目錄下的 temp 文件夾。指定 java.io.tmpdir 對應目錄的地方也是在 bin/catalina.sh 命令里。

首先,tomcat 啟動的時候,雖然用的啟動命令是  bin/startup.sh ,但這只是一個入口,啟動的過程都是在 bin/catalina.sh 這個命令里,這個 catalina.sh 才是主要的命令,你甚至可以通過catalina.sh 這個命令啟動 tomcat 。

那么,回歸主題,tomcat 是如何指定它的臨時目錄的呢?

用文本編輯器打開 bin/catalina.sh 命令文件,上面是一大段注釋,從注釋中可以看到:

 

CATALINA_TMPDIR  這個對應的是tomcat的臨時目錄,而 JVM 的 java.io.tmpdir 使用的就是 CATALINA_TMPDIR 對應的目錄。

接着往下翻可以看到:

 

CATALINA_TMPDIR  對應的是  "$CATALINA_BASE" 下的 temp 文件夾,而 "$CATALINA_BASE" 就是 tomcat 的安裝目錄,

也就是說在這里,指定了 tomcat 的臨時目錄是tomcat安裝目錄下的 temp 文件夾

 

 而 tomcat 又是如何指定 CATALINA_TMPDIR   作為 java.io.tmpdir 對應的目錄的呢?

接着往下看,可以看到:

在執行的時候,通過 java -D 命令,指定了 JVM 的 java.io.tmpdir 系統屬性的值為  CATALINA_TMPDIR   對應的值

可以看到,tomcat 在啟動的時候就已經指定了 java.io.tmpdir 對應的屬性值,並且指定的是它的臨時目錄,這樣在程序中通過 java.io.tmpdir  獲取臨時目錄的時候,取到的都是tomcat的臨時目錄地址

 

總結一下:

1、tomcat 的臨時目錄地址是在 bin/catalina.sh 命令里指定的,指定的默認值是  安裝目錄下的 temp 文件夾,當然也可以根據需要修改成自己想要設置的目錄地址

2、以 tomcat 為容器的項目里,通過 System.getProperty("java.io.tmpdir")   取JVM的臨時目錄地址,取到的都是tomcat的臨時目錄,這是在tomcat啟動時就指定的

3、拼接文件地址的時候,一定要注意目錄之間的分隔符  /  ,沒有分隔符 /  ,目錄名就成了文件名的一部分

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM