fileupload

fileupload

FileUpload 是 Apache commons下面的一個子項目,用來實現Java環境下面的檔案上傳功能,與常見的SmartUpload齊名。

基本介紹

  • 中文名:fileupload
使用組件,工作原理,解析,實例,控制,

使用組件

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

工作原理

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

解析

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

實例

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

控制

如果你的使用情況和上面描述的例子很接近,但是你需要在一點更多的控制限定檔案的大小或臨時檔案的存放位置。你可以很容易的自定義上傳實例或檔案項目或兩者的行為。下面例子展示了幾種配置選項:
// 創建磁碟工廠
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自定義(註:不知道為什麼這裡連結過去的頁面什麼也沒有)。

相關詞條

熱門詞條

聯絡我們