文件上傳和下載

 

文件上傳

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));

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章