工作原理
上傳的文件要求包括一個根據RFC1867(在HTML中基于表單的文件)編碼的選項列表清單。組件FileUpload可以解析這個請求,并給你的應用程序提供一份獨立上傳的項目清單。無論每個項目背後如何執行都實現了FileItem接口。
這裡将描述組件FileUpload庫的普通API,這些API比較簡單。不過,對于最終的實現,你可以參考最新的API流。
每一個文件項目都有一些屬性,這些可能在你的應用程序中應用到。比如:每一個項目有一個名稱name和内容類型congtent type,并提供了一個InputStream訪問其數據。另一方面,你處理項目的方法可能有所不同,這個依賴于是否這個項目是一個規則的表單域,即:這個數據是來自普通的表單文本,還是普通的HTML域或是一個上傳文件。在FileItem接口中提供了處理這些問題的方法,可以更加方便的去訪問這些數據。
組件FileUpload使用FileItemFactory工廠創建新的文件項目。這個給了組件FileUpload很大的靈活性。這個工廠擁有怎樣創建項目的最終控制權。工廠執行過程中上傳項目文件的臨時數據可以存儲在内存中或硬盤上。這個依賴于上傳項目的大小(即:數據的字節)。不過這種行為可以在你的應用程序中适當的自定制。
解析
在實現上傳項目之前,當然需要解析這個請求。确保這個請求的确是一個正确的上傳文件,組件FileUpload為了使這個判斷簡單,提供了一個靜态的方法去做這個事情。
//檢測我們是否一個文件上傳的請求
boolean isMultipart=ServletFileUpload.isMultipartContent(request);
實例
最簡單的使用情況如下:
上傳項目隻要足夠小,就應該将其保存在内存中。
較大的項目應該被寫入到硬盤的臨時文件中。
應該避免有非常大的上傳項目。
設置項目默認的在内存中所占的空間,限制最大的上傳請求,并設定臨時文件的位置。
處理這種情況下的請求非常的簡單:
//創建磁盤工廠
FileItemFactory factory=new DiskFileItem(Factory);
//創建處理工具
ServletFileUpload upload=new ServletFileUpload(factory);
//解析
List items=upload.parseRequest(request);
這就是我們真正需要的全部代碼。
處理的結果是生成了一個文件項目列表,每個文件項目實現一個FileItem接口。下面将介紹如何處理這些項目。
控制
如果你的使用情況和上面描述的例子很接近,但是你需要在一點更多的控制限定文件的大小或臨時文件的存放位置。你可以很容易的自定義上傳實例或文件項目或兩者的行為。下面例子展示了幾種配置選項:
//創建磁盤工廠
DiskFileItemFactory factory=new DiskFileItemFactory();
//設置參數
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
//創建處理工具
ServletFileUpload upload=new ServletFileUpload(factory);
//設置最大允許的尺寸
upload.setSizeMax(yourMaxRequestSize);
//解析
List items=upload.parseRequest(request);
當然,每一個配置處理方法都是獨立于其他方法的,但是如果你想一次性配置這個工廠,你可以使用工廠的另一個重載方法。像這樣:
DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize,yourTempDirectory);
如果你還需要更多的控制請求的解析,比如存儲項目到其它地方(如:數據庫),你将需要看看FileUpload自定義。



















