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為基礎來寫得,具體情況需要修改。