在 http://www.apache.org,下載commons-fileupload-1.2.1.jar包,並把這個包加到工程中,以下是記錄這個上傳組件的一些使用方法。
html測試頁面,實現上傳兩個檔案,並填寫四個參數。
<form action="../FileServlet" enctype="multipart/form-data" method="post" >
<dt>本人名稱:</dt> <dd><input type="text" name="name" class="file-input" />dd> <dt>銀行賬戶:</dt> <dd>< <input type="text" name="account" class="file-input" /></dd> <dt>開戶銀行:</dt> <dd>< <input type="text" name="bank" class="file-input" /><dd> <dt>社會安全號碼:</dt> <dd> <input type="text" name="number" class="file-input" /></dd> <dt>身份證照片:</dt> <dd><input type="file" name="photo" class="file-input" /></dd> <dt>銀行卡照片:</dt> <dd> <input type="file" name="card" class="file-input" /> </dd>
</form>
在上傳檔案的時候,form表單的entype必須是multipart/form-data,這種情況下,在台通過request.getParameter();方法就無法獲得參數,返回的都是空值。所以這裡就不能再使用getParameter()這個方法,下面介紹一下commons-fileupload裡的一些方法。
首先把請求訊息實體中的每一個項目封裝成單獨的DiskFileItem(FileItem的實現)對象,這是通過使用實現了org.apache.commons.fileupload.FileItemFactory介面的org.apache.commons.fileupload.DiskFileItemFactory來完成的,當上傳的檔案比較小時,可直接儲存在記憶體中,這樣速度比較快,當檔案較大時使用臨時檔案快取。代碼如下
FileItemFactory factory= new DiskFileItemFactry();
ServletFileUpload upload = new ServletFileUpload(factory); //獲得ServletFileUpload 對象upload
List<FileItem> listItem = upload.parseRequest(request); //解析request,把每個項目封裝成單獨的FileItem
//遍曆listItem
for (FileItem item : listItem) {
if(!item.isFormField()){//說明這個項目是個檔案,上傳到伺服器
String fileName = item.getName(); //這個名字檔案的完整路徑名
String fileUploadName = fileName.substring(fileName
.lastIndexOf("\\") + 1); //獲得檔案的名字,不包含路徑
item.write(new File(path, fileUploadName)); //寫入磁碟,path是檔案的寫入路徑
}else{//這個項目就是一個參數可以擷取
String filed = item.getFieldName(); //獲得這個參數名
if (filed.equals("bank")) { //根據判斷獲得參數值,並賦給已聲明的變數
bank = item.getString();
}
if (filed.equals("number")) {
number = item.getString();
}
if (filed.equals("account")) {
account = item.getString();
}
}
}
這樣,即上傳了檔案,也擷取到了頁面參數。