1、可以實現一個或多個文件的上傳,也可以接收普通的form表單數據。
2、簡單測試了一下,對內存的占用還是可以忍受的,而且速度也可以。偶爾會導致內存使用的上升而且不會下降,長時間後是否會降下來還沒有測試。
關鍵點:
1、提交文件上傳的form的method屬性為post,enctype屬性為multipart/form-data。
2、input標簽需要有name屬性,否則取不到內容。
看看servlet的實現,注釋已經很詳細了:
Java代碼
package org.xxm; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dareway.org.apache.commons.fileupload.FileItem; import dareway.org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; import dareway.org.apache.commons.fileupload.disk.DiskFileItemFactory; import dareway.org.apache.commons.fileupload.servlet.ServletFileUpload; import dareway.org.apache.commons.fileupload.util.Streams; /** * @author xuxiaoming * 2009-03-19 * 以tomcat6.0為服務器 */ public class UploadFileServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) { return; } public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException { /** * form中的enctype必須是multipart/... * 組件提供方法檢測form表單的enctype屬性 * 在isMultipartContent方法中同時檢測了是否是post提交 * 如果不是post提交則返回false */ if(ServletFileUpload.isMultipartContent(req)) { req.setCharacterEncoding("utf-8"); DiskFileItemFactory factory = new DiskFileItemFactory(); /** * 臨時文件存儲路徑要真實存在 */ factory.setRepository(new File("../webapps/fileupload/tmp")); //內存最大占用 factory.setSizeThreshold(1024000); ServletFileUpload sfu = new ServletFileUpload(factory); //單個文件最大值byte sfu.setFileSizeMax(102400000); //所有上傳文件的總和最大值byte sfu.setSizeMax(204800000); List items = null; try { items = sfu.parseRequest(req); } catch (SizeLimitExceededException e) { System.out.println("size limit exception!"); } catch(Exception e) { e.printStackTrace(); } Iterator iter = items==null?null:items.iterator(); while(iter != null && iter.hasNext()) { FileItem item = (FileItem)iter.next(); //簡單的表單域 if(item.isFormField()) { System.out.print("form field:"); System.out.print(item.getFieldName() + " "); System.out.print(item.getString()); } //文件域 else if(!item.isFormField()) { System.out.println("client name:" + item.getName()); String fileName = item.getName().substring(item.getName().lastIndexOf("\\")); BufferedInputStream in = new BufferedInputStream(item.getInputStream()); //文件存儲在工程的upload目錄下,這個目錄也得存在 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File("../webapps/fileupload/upload/" + fileName))); Streams.copy(in, out, true); } } } else { System.out.println("enctype error!"); } } }
因為使用tomcat做得服務器,所以裡面的路徑都是以tomcat為基礎來寫得,具體情況需要修改。