servlet實現form表單的檔案上傳
注:該方法需要用到commons-fileupload-1.2.2.jar和commons-io-2.4.jar兩個包,自行下載。
首先,需要在form表單中設定enctype="multipart/form-data"屬性,就能實現檔案上傳,但是由於enctype="multipart/form-data"是以二進位制的資料格式傳輸,所以在servlet中無法通過request.getParameter("name")獲得值。具體方法如下(紅色加粗表示對上傳檔案格式的判斷,可自行選擇):
List fileType = newArrayList();
fileType.add("gif");
fileType.add("jpg");
fileType.add("png");
fileType.add("rar");
request.setCharacterEncoding("utf-8");
StringuploadFileName="";//上傳的檔名
StringfieldName="";//表單欄位元素的name屬性值
//請求資訊中的內容是否是multipart型別
booleanisMultipart =ServletFileUpload.isMultipartContent(request);
//上傳檔案的儲存路徑(伺服器檔案系統上的絕對檔案路徑)
StringuploadFilePath =request.getSession().getServletContext().getRealPath("upload/");//此時需要在WebRoot下建立一個“upload"資料夾
if(isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = newServletFileUpload(factory);
upload.setSizeMax(1024 *1024*20);//20M大小
try {
//解析form表單中所有檔案
List items =upload.parseRequest(request);
Iterator iter =items.iterator();
while(iter.hasNext()) {//依次處理每個檔案
FileItem item = (FileItem)iter.next();
String fileName =item.getName();
if(item.isFormField()){//如果是普通表單輸入域
fieldName =item.getFieldName();//表單欄位的name屬性值
if(fieldName.equals("fname")){//fname為form表單裡對應的name的值
lastName =item.getString("UTF-8");//lastName用來接收與name相對應的value的值
}
} else {//如果是檔案上傳域
Stringext =fileName.substring(fileName.lastIndexOf(".") + 1);
if (fileType.contains(ext)){
if (fileName != null&& !fileName.equals("")) {
File fullFile = newFile(item.getName());
File saveFile = newFile(uploadFilePath,fullFile.getName());
item.write(saveFile);//上傳
uploadFileName =fullFile.getName();
}
} else {
response.sendRedirect("........");
}
}
}
} catch (Exception e) {
response.sendRedirect("..........");
}
}