public class FileUploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//判斷表單是否包含文件域(其實也就是判斷表單是否包含enctype="multipart/form-data"屬性)
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
//爲上傳的文件創建工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
//設置臨時目錄緩存文件大小
factory.setSizeThreshold(5*1024);
// 獲得容器(如:tomcat服務器)上下文環境
ServletContext servletContext = this.getServletConfig().getServletContext();
//臨時目錄存在點,由服務器決定,tomcat的臨時目錄是work
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
//設置工廠的臨時目錄
factory.setRepository(repository);
// 創建文件上傳處理程序
ServletFileUpload upload = new ServletFileUpload(factory);
//允許上傳的最大文件5mb
upload.setSizeMax(5*1024*1024);
//設置上傳文件的最終存放路徑,存放在部署項目的upload文件夾下
String uploadPath = servletContext.getRealPath("/")+File.separator+"upload";
try {
// 解析上傳文件的 表單請求參數(即表單的name屬性)
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
//遍歷name屬性(表單屬性份爲兩種:1.普通name屬性 2.文件域)
String name = "";
while (iter.hasNext()) {
//表單name屬性對象的input元素
FileItem item = iter.next();
String filedName = item.getFieldName();//獲取field的name屬性
String filedValue = item.getString();//獲取field的值(value)
//判斷是普通name,還是文件域
if (item.isFormField()) {
//測試普通表單域
System.out.println(filedValue);
//注意!!!!!!!!!!!!!!!!!!!!!
//獲取普通表單域中的value時,不能再像以往那樣使用getParameter()方法了,因爲普通表單域也在流中,我們應該
//通過FileItem的getString()獲取普通表單域中的value。如果想通過name獲取,應該使用下面的方式:
if("name".equals(filedName)){
// name = item.getString();
name = item.getString("utf-8");//使用utf-8的編碼方式獲取,也可以採用平臺默認的編碼方式,如上
}
} else {
//表單中的文件域且文件域不爲空
if(!"".equals(filedName.trim())){
//要上傳的文件
File file = new File(uploadPath, item.getName());
//上傳文件
item.write(file);
//刪除臨時文件(也可以使用監聽器自動刪除臨時文件)
item.delete();
// 在web.xml中加入下面內容:
// <listener>
// <listener-class>
// org.apache.commons.fileupload.servlet.FileCleanerCleanup
// </listener-class>
// </listener>
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
使用commons-fileupload上傳文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.