1. 程式人生 > >org.apache.commons.fileupload上傳臨時檔案刪除方法2則

org.apache.commons.fileupload上傳臨時檔案刪除方法2則

在將檔案項封裝成FileItem 物件時,如果檔案尺寸大於臨界值,將會被寫入臨時檔案。

  • 清理方法1

這些臨時檔案在不再被使用的時候(如果相應的java.io.File是可回收的則更好)會自動被刪除.這會被org.apache.commons.io.FileCleaningTracker的一個例項啟動的一個收割執行緒默默執行.

    在一個web應用中,資源清理是被javax.servlet.ServletContextListener的一個例項控制的.在其他環境中,類似的觀念定是適用的.

     FileCleanerCleanup

      web應用應該使用org.apache.commons.fileupload.FileCleanerCleanup的一個例項,只要把它 web.xml 中:

     <web-app>
       ...
       <listener>
         <listener-class>
           org.apache.commons.fileupload.servlet.FileCleanerCleanup
         </listener-class>
       </listener>
       ...
     </web-app>

不幸的是,事情到這裡還沒完。如果你和下面的情況一樣,那麼你就只需要按照上面的做,就可以清除資源了。你使用的是commons-io 1.3

或者更晚的版本。你是從web應用的web-inf/lib裡載入commons-io的,並不是從其它位置,如Tomcatcommon/lib下。如果commons-io 1.3是從你的WEB容器的classpath裡載入的,那麼,下面的情況可能會出現:建議你執行兩個應用,一個叫A,一個叫B。(這兩個應用可能是完全一樣,只不過上下文名稱不一樣。)這兩個應用都使用了FileCleanerCleanup。現在,如果你終止應用AB還在執行,這時,A會終止B的收割機執行緒。換言之,你要十分仔細地考慮是使用FileCleanerCleanup,還是不使用。

  • 清理方法2

建立一個 DiskFileItemFactory

      FileCleanerCleanup 提供一個 org.apache.commons.io.FileCleaningTracker 例項.此例項必須在建立一個 org.apache.commons.fileupload.disk.DiskFileItemFactory 時使用.這應該通過呼叫如下方法來實現:

FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(servletcontext);

DiskFileItemFactory factory = new DiskFileItemFactory();

factory.setFileCleaningTracker(fileCleaningTracker);

 FileCleanerCleanup 通過一個靜態方法getFileCleaningTracker()提供一個
org.apache.commons.io.FileCleaningTracker 物件。構造DiskFileItemFactory後,需要設定一個 
FileCleaningTracker 物件,用於追蹤產生的臨時檔案。如果不想追蹤臨時檔案,設定 
FileCleaningTracker 為null。