1、可以實(shí)現(xiàn)一個(gè)或多個(gè)文件的上傳,也可以接收普通的form表單數(shù)據(jù)。
2、簡(jiǎn)單測(cè)試了一下,對(duì)內(nèi)存的占用還是可以忍受的,而且速度也可以。偶爾會(huì)導(dǎo)致內(nèi)存使用的上升而且不會(huì)下降,長(zhǎng)時(shí)間后是否會(huì)降下來(lái)還沒(méi)有測(cè)試。
關(guān)鍵點(diǎn):
1、提交文件上傳的form的method屬性為post,enctype屬性為multipart/form-data。
2、input標(biāo)簽需要有name屬性,否則取不到內(nèi)容。
看看servlet的實(shí)現(xiàn),注釋已經(jīng)很詳細(xì)了:
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;
/** 以tomcat6.0為服務(wù)器 */ 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/... * 組件提供方法檢測(cè)form表單的enctype屬性 * 在isMultipartContent方法中同時(shí)檢測(cè)了是否是post提交 * 如果不是post提交則返回false */ if(ServletFileUpload.isMultipartContent(req)) { req.setCharacterEncoding("utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
/** * 臨時(shí)文件存儲(chǔ)路徑要真實(shí)存在 */ factory.setRepository(new File("../webapps/fileupload/tmp"));
//內(nèi)存占用 factory.setSizeThreshold(1024000);
ServletFileUpload sfu = new ServletFileUpload(factory);
//單個(gè)文件值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();
//簡(jiǎn)單的表單域 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());
//文件存儲(chǔ)在工程的upload目錄下,這個(gè)目錄也得存在 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File("../webapps/fileupload/upload/" + fileName)));
Streams.copy(in, out, true);
} } } else { System.out.println("enctype error!");
} } }
因?yàn)槭褂胻omcat做得服務(wù)器,所以里面的路徑都是以tomcat為基礎(chǔ)來(lái)寫(xiě)得,具體情況需要修改。
2、簡(jiǎn)單測(cè)試了一下,對(duì)內(nèi)存的占用還是可以忍受的,而且速度也可以。偶爾會(huì)導(dǎo)致內(nèi)存使用的上升而且不會(huì)下降,長(zhǎng)時(shí)間后是否會(huì)降下來(lái)還沒(méi)有測(cè)試。
關(guān)鍵點(diǎn):
1、提交文件上傳的form的method屬性為post,enctype屬性為multipart/form-data。
2、input標(biāo)簽需要有name屬性,否則取不到內(nèi)容。
看看servlet的實(shí)現(xiàn),注釋已經(jīng)很詳細(xì)了:
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;
/** 以tomcat6.0為服務(wù)器 */ 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/... * 組件提供方法檢測(cè)form表單的enctype屬性 * 在isMultipartContent方法中同時(shí)檢測(cè)了是否是post提交 * 如果不是post提交則返回false */ if(ServletFileUpload.isMultipartContent(req)) { req.setCharacterEncoding("utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
/** * 臨時(shí)文件存儲(chǔ)路徑要真實(shí)存在 */ factory.setRepository(new File("../webapps/fileupload/tmp"));
//內(nèi)存占用 factory.setSizeThreshold(1024000);
ServletFileUpload sfu = new ServletFileUpload(factory);
//單個(gè)文件值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();
//簡(jiǎn)單的表單域 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());
//文件存儲(chǔ)在工程的upload目錄下,這個(gè)目錄也得存在 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File("../webapps/fileupload/upload/" + fileName)));
Streams.copy(in, out, true);
} } } else { System.out.println("enctype error!");
} } }
因?yàn)槭褂胻omcat做得服務(wù)器,所以里面的路徑都是以tomcat為基礎(chǔ)來(lái)寫(xiě)得,具體情況需要修改。

