群活动(一)_fileupload 文件的上传下载

群里的朋友无聊,于是出了题目大家一起做,原理很简单

用第三方jar包,commons-fileupload-1.2.2.jar,由于该jar依赖commons-io-2.0.1.jar,所以也加上这IO包

外加一个mysql数据库驱动jar,demo就用这3jar,

具体commons-fileupload-1.2.2.jar这个工具包怎么用,见apach官方网站 http://commons.apache.org/fileupload/using.html 

 

上传处理主要是保存解析request及对解析后的对象进行流处理,所以,没有IO流操作基础的童鞋,可能存在一些困难。

在我这个demo中,流程是,

1、多个文件上传框,用户可以自由选择要上传的文件

2、点击上传后,在servlet中由fileupload去解析request,然后得到上传的文件封装对象FileItem和普通文本域(用UploadFile类封装了这两种类型的数据)

3、在servlet中进行其他操作,比如存数据、存硬盘、存硬盘并且讲文件在硬盘路径存数据库等。

4、上传成功跳转到下载页面。用户可对以往文件进行下载。

文件介绍:

1、UploadSvt 处理上传请求,处理上传数据等

2、UploadUtil上传工具类,主要是封装上传的文件对象和普通表单域对象

3、UploadFile由UploadUtil封装好的“上传的文件对象和普通表单域对象”存放到该类

4、DaoUtil处理数据库连接等系列数据

 

这里主要是贴几处重要的代码,

在实现流程2的时候,是在servlet中调用了一个UploadUtil工具类,用户解析request,并且封装成一个辅助实体对象UploadFile,然后在该servlet中进行其他的操作

 

UploadSvt 上传处理servlet:

 

 

/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	@SuppressWarnings("unchecked")
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		UploadFile uploadFile = null;
		UploadUtil upbase = new UploadUtil();

		try {
			uploadFile = upbase.parseRequest(request);
		} catch (Exception e) {
			e.printStackTrace();
			if (e.getMessage() != null) {
				response.getWriter().write(e.toString());
				response.getWriter().write("<a href='download.jsp'>下载</a>");
				response.getWriter().write("<a href='index.jsp'>上传</a>");
				response.getWriter().flush();
				response.getWriter().close();
			}
			return;
		}
		doSomething1(uploadFile);
		// doSomething2(uploadFile);
		// doSomething3(uploadFile);
		response.sendRedirect("download.jsp");
	}

 doSomething1、doSomething2doSomething3分别是三处理类,用于实现各种需求,如存数据库,存硬盘等等,

 

下面是FileUtil工具类中的解析方法,

 

 

public UploadFile parseRequest(HttpServletRequest request) throws Exception {
		request.setCharacterEncoding("UTF-8");
		// 判断是否为上传
		if (ServletFileUpload.isMultipartContent(request)) {
			// 初始一个DiskFileItemFactory
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 设置临时存放目录
			File file = new File(this.getClass().getResource( "/").getPath());
			if(!file.exists() || !file.isDirectory()){
				file.mkdirs();
			}
			factory.setRepository(file);
			// 设置在案内存中的最大限度
			factory.setSizeThreshold(UploadFile.SIZETHRESHOLD);
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 设置最大上传文件大小
			upload.setSizeMax(UploadFile.SIZEMAX);
			List<FileItem> items = null;
			try {
				// 格式化
				items = upload.parseRequest(request);
			} catch (Exception e) {
				e.printStackTrace();
				if (e instanceof SizeLimitExceededException) {
					throw new Exception("ERROR:上传文件过大,文件最大:"+UploadFile.SIZEMAX/1024+"KB");
				}else{
					throw new Exception("解析请求错误"+e.getMessage());
				}
			}
			// 取得item的迭代对象
			Iterator<FileItem> iter = items.iterator();
			UploadFile uploadFile = new UploadFile();
			Map<String, Object> fields = uploadFile.getFields();
			List<FileItem> files = uploadFile.getFiles();
			while (iter.hasNext()) {
				FileItem item = (FileItem) iter.next();
				if (item.isFormField()) {
					String fieldName = new String(item.getFieldName().getBytes(
							"ISO-8859-1"), "UTF-8");
					String fieldValue = new String(item.getString().getBytes(
							"ISO-8859-1"), "UTF-8");
					if (fields.containsKey(fieldName)) {
						Object obj = fields.get(fieldName);
						if (obj instanceof List) {
							List<Object> ob = (List<Object>) obj;
							ob.add(fieldValue);
						} else {
							List<Object> list = new ArrayList<Object>();
							list.add(obj);
							fields.remove(fieldName);
							fields.put(fieldName, list);
						}
					} else {
						fields.put(fieldName, fieldValue);
					}
				} else if (item.get() != null && item.get().length > 0) {
					files.add(item);
				}
			}
			request.setAttribute(UploadFile.REQATTRIBUTENAME, uploadFile);
			return uploadFile;
		} else {
			throw new Exception("ERROR:该请求不是上传文件 ");
		}
	}

 

还有一个UploadFile实现如下:用于封装解析request后的数据,

 

 

/**
 * fileuploadanddownload
 * UploadFile.java
 * @author lyjilu
 * date 2011-9-17
 * @version 1.0
 */
package com.lyjilu.model.entity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.fileupload.FileItem;

/**
 * @author lyjilu
 * date 2011-9-17
 * @version 1.0
 * 上传文件对象,用于处理request时,封装上传对象几普通表单域
 */
public class UploadFile {
	/**
	 * 默认临时存储目录
	 */
	public static final String TEMPREPOSITORY = "temp/";
	/**
	 * 在内存中的最大限度
	 */
	public static final int SIZETHRESHOLD = 10000000;
	/**
	 * 
	 */
	public UploadFile() {
	}
	/**
	 * 最大上传文件大小
	 */
	public static final int SIZEMAX = 5024000;
	/**
	 * 变量,永远在request.setAttribute的时候的键,方便统一取值
	 */
	public static final String REQATTRIBUTENAME = "__UploadFile";
	/**
	 * 上传文件集合
	 */
	private List<FileItem> files = new ArrayList<FileItem>();
	/**
	 * 文本 域数据集合
	 */
	private Map<String, Object> fields = new HashMap<String, Object>();

	public Map<String, Object> getFields() {
		return fields;
	}

	public void setFields(Map<String, Object> fields) {
		this.fields = fields;
	}

	public List<FileItem> getFiles() {
		return files;
	}

	public void setFiles(List<FileItem> files) {
		this.files = files;
	}
}

 

demo重要的类基本就这些,还有个下载页面 其它都是简单jsp页面,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值