文件上傳
Request對象提供了一個getInputStream方法,通過這個方法可以讀取到客戶端提交過來的數據。但由於用戶可能會同時上傳多個文件,在servlet端編程直接讀取上傳數據,並分別解析出相應的文件數據是一項非常麻煩的工作,示例。
爲方便用戶處理文件上傳數據,Apache 開源組織提供了一個用來處理表單文件上傳的一個開源組件( Commons-fileupload ),該組件性能優異,並且其API使用極其簡單,可以讓開發人員輕鬆實現web文件上傳功能,因此在web開發中實現文件上傳功能,通常使用Commons-fileupload組件實現。
使用Commons-fileupload組件實現文件上傳,需要導入該組件相應的支撐jar包:Commons-fileupload和commons-io。commons-io 不屬於文件上傳組件的開發jar文件,但Commons-fileupload 組件從1.1 版本開始,它工作時需要commons-io包的支持。
DiskFileItemFactory 是創建 FileItem 對象的工廠,這個工廠類常用方法:
public void setSizeThreshold(int sizeThreshold) :設置內存緩衝區的大小,默認值爲10K。當上傳文件大於緩衝區大小時, fileupload組件將使用臨時文件緩存上傳文件。
public void setRepository(java.io.File repository) :指定臨時文件目錄,默認值爲System.getProperty("java.io.tmpdir").
public DiskFileItemFactory(int sizeThreshold, java.io.File repository) :構造函數
ServletFileUpload 負責處理上傳的文件數據,並將表單中每個輸入項封裝成一個 FileItem 對象中。常用方法有:
boolean isMultipartContent(HttpServletRequest request) :判斷上傳表單是否爲multipart/form-data類型
List parseRequest(HttpServletRequest request):解析request對象,並把表單中的每一個輸入項包裝成一個fileItem 對象,並返回一個保存了所有FileItem的list集合。
setFileSizeMax(long fileSizeMax) :設置上傳文件的最大值
setSizeMax(long sizeMax) :設置上傳文件總量的最大值
setHeaderEncoding(java.lang.String encoding) :設置編碼格式
setProgressListener(ProgressListener pListener)
實現步驟
1、創建DiskFileItemFactory對象,設置緩衝區大小和臨時文件目錄
2、使用DiskFileItemFactory 對象創建ServletFileUpload對象,並設置上傳文件的大小限制。
3、調用ServletFileUpload.parseRequest方法解析request對象,得到一個保存了所有上傳內容的List對象。
4、對list進行迭代,每迭代一個FileItem對象,調用其isFormField方法判斷是否是上傳文件
爲普通表單字段,則調用getFieldName、getString方法得到字段名和字段值
爲上傳文件,則調用getInputStream方法得到數據輸入流,從而讀取上傳數據。
表單屬性enctype的設置
multipart/form-data和application/x-www-form-urlencoded的區別
FORM元素的enctype屬性指定了表單數據向服務器提交時所採用的編碼類型,默認的缺省值是“application/x-www-form-urlencoded”。
然而,在向服務器發送大量的文本、包含非ASCII字符的文本或二進制數據時這種編碼方式效率很低。
在文件上載時,所使用的編碼類型應當是“multipart/form-data”,它既可以發送文本數據,也支持二進制數據上載。
Browser端<form>表單的ENCTYPE屬性值爲multipart/form-data,它告訴我們傳輸的數據要用到多媒體傳輸協議,由於多媒體傳輸的都是大量的數據,所以規定上傳文件必須是post方法,<input>的type屬性必須是file。
1、upload.jsp
<form action="${pageContext.request.contextPath}/servlet/UploadServlet" enctype="multipart/form-data" method="post">
上傳用戶<input type="text" name="username" /><br/>
文件1<input type="file" name="file1" /><br/>
文件2<input type="file" name="file2" /><br/>
<input type="submit" value="submit" /><br/>
</form>
2、UploadServlet
3、UploadServlet
int len = 0;
while((len=in.read(buffer))>0){
System.out.println(new String(buffer));
}