利用apache的FileUpload组件实现文件上传

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);//单个文件最大值bytesfu.setFileSizeMax(102400000);//所有上传文件的总和最大值bytesfu.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 ut = new BufferedOutputStream(new FileOutputStream(new File("../webapps/fileupload/upload/" + fileName)));Streams.copy(in, out, true);}}} else {System.out.println("enctype error!");}}}

因为使用tomcat做得服务器,所以里面的路径都是以tomcat为基础来写得,具体情况需要修改。

不敢面对自己的不完美,总是担心自己的失败,

利用apache的FileUpload组件实现文件上传

相关文章:

你感兴趣的文章:

标签云: