使用commons-fileupload上傳文件

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

}

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