轉自:http://blog.csdn.net/chinaliuyan/article/details/7002016
將請求消息實體中的每一個項目封裝成單獨的DiskFileItem (FileItem接口的實現) 對象的任務
由 org.apache.commons.fileupload.FileItemFactory 接口的默認實現
org.apache.commons.fileupload.disk.DiskFileItemFactory 來完成。當上傳的文件項目比較小時,直接保存在內存中(速度比較快),比較大時,以臨時文件的形式,保存在磁盤臨時文件夾(雖然速度慢些,但是內存資源是有限的)。
屬性
1) public static final int DEFAULT_SIZE_THRESHOLD :將文件保存在內存還是磁盤臨時文件夾的默認臨界值,值為10240,即10kb。
2) private File repository:用於配置在創建文件項目時,當文件項目大於臨界值時使用的臨時文件夾,默認采用系統默認的臨時文件路徑,可以通過系統屬性 java.io.tmpdir獲取。如下代碼:
System.getProperty("java.io.tmpdir");
3) private int sizeThreshold:用於保存將文件保存在內存還是磁盤臨時文件夾的臨界值
構造方法
1) public DiskFileItemFactory()
采用默認臨界值和系統臨時文件夾構造文件項工廠對象。
2) public DiskFileItemFactory(int sizeThreshold,File repository)
采用參數指定臨界值和系統臨時文件夾構造文件項工廠對象。
3) FileItem createItem()
根據DiskFileItemFactory相關配置將每一個請求消息實體項目創建成DiskFileItem 實例,並返回。該方法從來不需要我們親自調用,FileUpload組件在解析請求時內部使用。
4) void setSizeThreshold(int sizeThreshold)
Apache文件上傳組件在解析上傳數據中的每個字段內容時,需要臨時保存解析出的數據,以便在后面進行數據的進一步處理(保存在磁盤特定位置或插入數據庫)。因為Java虛擬機默認可以使用的內存空間是有限的,超出限制時將會拋出“java.lang.OutOfMemoryError”錯誤。如果上傳的文件很大,例如800M的文件,在內存中將無法臨時保存該文件內容,Apache文件上傳組件轉而采用臨時文件來保存這些數據;但如果上傳的文件很小,例如600個字節的文件,顯然將其直接保存在內存中性能會更加好些。
setSizeThreshold方法用於設置是否將上傳文件已臨時文件的形式保存在磁盤的臨界值(以字節為單位的int值),如果從沒有調用該方法設置此臨界值,將會采用系統默認值10KB。對應的getSizeThreshold() 方法用來獲取此臨界值。
5) void setRepository(File repository)
setRepositoryPath方法用於設置當上傳文件尺寸大於setSizeThreshold方法設置的臨界值時,將文件以臨時文件形式保存在磁盤上的存放目錄。有一個對應的獲得臨時文件夾的 File getRespository() 方法。
注意:當從沒有調用此方法設置臨時文件存儲目錄時,默認采用系統默認的臨時文件路徑,可以通過系統屬性 java.io.tmpdir 獲取。如下代碼:
System.getProperty("java.io.tmpdir");
Tomcat系統默認臨時目錄為“<tomcat安裝目錄>/temp/”。