论坛首页 Java企业应用论坛

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

浏览 12206 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-03-23  

利用apache的fileupload组件实现文件的上传
1、可以实现一个或多个文件的上传,也可以接收普通的form表单数据。
2、简单测试了一下,对内存的占用还是可以忍受的,而且速度也可以。偶尔会导致内存使用的上升而且不会下降,长时间后是否会降下来还没有测试。

关键点:
1、提交文件上传的form的method属性为post,enctype属性为multipart/form-data。
2、input标签需要有name属性,否则取不到内容。

看看servlet的实现,注释已经很详细了:

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为基础来写得,具体情况需要修改。

 

附件是一个做好的例子,可以直接部署。

 

下次会以这个为基础搞一个ajax式的文件上传。

   发表时间:2009-03-23  
apache的fileupload组件用了MINA框架没?
0 请登录后投票
   发表时间:2009-03-24  
以前用过这种方法,现在记不太清楚了,看楼主写的思路很清晰。还学了个Streams.copy(in, out, true);
0 请登录后投票
   发表时间:2009-03-24  
说实话.这种代码写出来有什么意义呢?

无非就是调用人家已经封装好了的API。这种谁都会的。

建议楼主看看 源码
0 请登录后投票
   发表时间:2009-03-25  
aspserver 写道

说实话.这种代码写出来有什么意义呢?

无非就是调用人家已经封装好了的API。这种谁都会的。

建议楼主看看 源码

没有意义,就是介绍一下而已。
0 请登录后投票
   发表时间:2009-03-25  
sxjkk 写道

apache的fileupload组件用了MINA框架没?

不知道MINA框架,大体看了看好像没有
0 请登录后投票
   发表时间:2009-07-22  
还是很不错的贴,对于第一次使用fileUpload的人会有很大帮助,至少给与一定了解
2 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics