複製鏈接
請複製以下鏈接發送給好友

fileupload

鎖定
FileUpload 是 Apache commons下面的一個子項目,用來實現Java環境下面的文件上傳功能,與常見的SmartUpload齊名。
外文名
fileupload
所屬項目
Apache commons

fileupload使用組件

可以通過許多種不同的方式使用組件FileUpload,這個主要取決於你的應用程序。在最簡單的情況下,你可以調用單一的方法去解析這個 Servlet Request,然後處理選項列表,並應用到你的應用程序。另一方面,你可能決定自定義FileUpload,實現對選項列表中個別項完全控制。例如:你可以將內容注入到數據庫。
這裏,我們將描述組件FileUpload的基本原則,並講解一些簡單的、常用的使用模式。FileUpload自定製將在其他地方描述。
組件FileUpload依賴於Commons IO組件,因此在繼續之前,要確保在你的工程classpath中有描述頁中提到的相應版本。(這裏FileUpload版本為:commons- fileupload-1.2.1,Commons IO版本為:commons-io-1.4)

fileupload工作原理

上傳的文件要求包括一個根據RFC 1867(在HTML中基於表單的文件)編碼的選項列表清單。組件FileUpload可以解析這個請求,並給你的應用程序提供一份獨立上傳的項目清單。無論每個項目背後如何執行都實現了FileItem接口。
這裏將描述組件FileUpload庫的普通API,這些API比較簡單。不過,對於最終的實現,你可以參考最新的API流。
每一個文件項目都有一些屬性,這些可能在你的應用程序中應用到。比如:每一個項目有一個名稱name和內容類型content type,並提供了一個 InputStream訪問其數據。另一方面,你處理項目的方法可能有所不同,這個依賴於是否這個項目是一個規則的表單域,即:這個數據是來自普通的表單文本,還是普通的HTML域或是一個上傳文件。在FileItem接口中提供了處理這些問題的方法,可以更加方便的去訪問這些數據。
組件FileUpload使用FileItemFactory工廠創建新的文件項目。這個給了組件FileUpload很大的靈活性。這個工廠擁有怎樣創建項目的最終控制權。工廠執行過程中上傳項目文件的臨時數據可以存儲在內存中或硬盤上。這個依賴於上傳項目的大小(即:數據的字節)。不過這種行為可以在你的應用程序中適當的自定製。

fileupload解析

在實現上傳項目之前,當然需要解析這個請求。確保這個請求的確是一個正確的上傳文件,組件FileUpload為了使這個判斷簡單,提供了一個靜態的方法去做這個事情。
// 檢測我們是否一個文件上傳的請求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);

fileupload實例

最簡單的使用情況如下:
* 上傳項目只要足夠小,就應該將其保存在內存中。
* 較大的項目應該被寫入到硬盤的臨時文件中。
* 應該避免有非常大的上傳項目。
* 設置項目默認的在內存中所佔的空間,限制最大的上傳請求,並設定臨時文件 的位置。
處理這種情況下的請求非常的簡單:
// 創建磁盤工廠
FileItemFactory factory = new DiskFileItemFactory();
// 創建處理工具
ServletFileUpload upload = new ServletFileUpload(factory);
// 解析
List <FileItem> items = upload.parseRequest(request);
這就是我們真正需要的全部代碼。
處理的結果是生成了一個文件項目列表,每個文件項目實現一個FileItem接口。下面將介紹如何處理這些項目。

fileupload控制

如果你的使用情況和上面描述的例子很接近,但是你需要在一點更多的控制限定文件的大小或臨時文件的存放位置。你可以很容易的自定義上傳實例或文件項目或兩者的行為。下面例子展示了幾種配置選項:
// 創建磁盤工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
// 設置參數
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// 創建處理工具
ServletFileUpload upload = new ServletFileUpload(factory);
// 設置最大允許的尺寸
upload.setSizeMax(yourMaxRequestSize);
// 解析
List <FileItem> items = upload.parseRequest(request);
當然,每一個配置處理方法都是獨立於其他方法的,但是如果你想一次性配置這個工廠,你可以使用工廠的另一個重載方法。像這樣:
DiskFileItemFactory factory = new DiskFileItemFactory( yourMaxMemorySize, yourTempDirectory);
如果你還需要更多的控制請求的解析,比如存儲項目到其它地方(如:數據庫),你將需要看看FileUpload自定義(注:不知道為什麼這裏鏈接過去的頁面什麼也沒有)。