org.apache.commons.fileupload.servlet.ServletFileUpload類是Apache文件上傳組件處理文件上傳的核心高級類(所謂高級就是不須要管底層實現,暴露給用戶的簡單易用的接口)。java
使用其parseRequest(HttpServletRequest) 方法能夠將經過表單中每個HTML標籤提交的數據封裝成一個FileItem對象,而後以List列表的形式返回。使用該方法處理上傳文件簡單易用。apache
在使用ServletFileUpload對象解析請求時須要根據DiskFileItemFactory對象的屬性sizeThreshold(臨界值)和repository(臨時目錄)來決定將解析獲得的數據保存在內存仍是臨時文件中,若是是臨時文件,保存在哪一個臨時目錄中?。因此,咱們須要在進行解析工做前構造好DiskFileItemFactory對象,經過ServletFileUpload對象的構造方法或setFileItemFactory()方法設置ServletFileUpload對象的fileItemFactory屬性。數組
ServletFileUpload繼承結構:
java.lang.Object服務器
|—org.apache.commons.fileupload.FileUploadBase性能
|—org.apache.commons.fileupload.FileUpload編碼
|—org.apache.commons.fileupload.servlet.ServletFileUploadspa
構造方法:
1) public ServletFileUpload()orm
構造一個未初始化的實例,須要在解析請求以前先調用setFileItemFactory()方法設置 fileItemFactory屬性。對象
2) public ServletFileUpload(FileItemFactory fileItemFactory)繼承
構造一個實例,並根據參數指定的FileItemFactory 對象,設置 fileItemFactory屬性。
ServletFileUpload類經常使用方法:
1) public void setSizeMax(long sizeMax)
setSizeMax方法繼承自FileUploadBase類,用於設置請求消息實體內容(即全部上傳數據)的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節爲單位的long型數字。
在請求解析的過程當中,若是請求消息體內容的大小超過了setSizeMax方法的設置值,將會拋出FileUploadBase內部定義的SizeLimitExceededException異常(FileUploadException的子類)。該方法有一個對應的讀方法:public long getSizeMax()方法。
2) public void setFileSizeMax(long fileSizeMax)
setFileSizeMax方法繼承自FileUploadBase類,用於設置單個上傳文件的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節爲單位的long型數字。該方法有一個對應的讀方法:public long geFileSizeMax()方法。
在請求解析的過程當中,若是單個上傳文件的大小超過了setFileSizeMax方法的設置值,將會拋出FileUploadBase內部定義的FileSizeLimitExceededException異常(FileUploadException的子類)。
3) public List parseRequest(javax.servlet.http.HttpServletRequest req)
parseRequest 方法是ServletFileUpload類的重要方法,它是對HTTP請求消息體內容進行解析的入口方法。它解析出FORM表單中的每一個字段的數據,並將它們分別包裝成獨立的FileItem對象,而後將這些FileItem對象加入進一個List類型的集合對象中返回。
該方法拋出FileUploadException異常來處理諸如文件尺寸過大、請求消息中的實體內容的類型不是「multipart/form-data」、IO異常、請求消息體長度信息丟失等各類異常。每一種異常都是FileUploadException的一個子類型。
4) public FileItemIterator getItemIterator(HttpServletRequest request)
getItemIterator方法和parseRequest 方法基本相同。可是getItemIterator方法返回的是一個迭代器,該迭代器中保存的不是FileItem對象,而是FileItemStream 對象,若是你但願進一步提升新能,你能夠採用getItemIterator方法,直接得到每個文件項的數據輸入流,作底層處理;若是性能不是問題,你但願代碼簡單,則採用parseRequest方法便可。
5) public stiatc boolean isMultipartContent(HttpServletRequest req)
isMultipartContent方法方法用於判斷請求消息中的內容是不是「multipart/form-data」類型,是則返回true,不然返回false。isMultipartContent方法是一個靜態方法,不用建立ServletFileUpload類的實例對象便可被調用。
6) getFileItemFactory()和setFileItemFactory(FileItemFactory)
方法繼承自FileUpload類,用於設置和讀取fileItemFactory屬性。
7) public void setProgressListener(ProgressListener pListener)
設置文件上傳進度監聽器。該方法有一個對應的讀取方法:ProgressListener getProgressListener()。
8) public void setHeaderEncoding()
在文件上傳請求的消息體中,除了普通表單域的值是文本內容之外,文件上傳字段中的文件路徑名也是文本,在內存中保存的是它們的某種字符集編碼的字節數組,Apache文件上傳組件在讀取這些內容時,必須知道它們所採用的字符集編碼,才能將它們轉換成正確的字符文本返回。
setHeaderEncoding方法繼承自FileUploadBase類,用於設置上面提到的字符編碼。若是沒有設置,則對應的讀方法getHeaderEncoding()方法返回null,將採用HttpServletRequest設置的字符編碼,若是HttpServletRequest的字符編碼也爲null,則採用系統默認字符編碼。能夠經過一下語句得到系統默認字符編碼:
System.getProperty("file.encoding"));