群活动(一)_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、doSomething2、doSomething3分别是三处理类,用于实现各种需求,如存数据库,存硬盘等等,
?
下面是FileUtil工具类中的解析方法,
?
?
public UploadFile parseRequest(HttpServletRequest request) throws Exception {request.setCharacterEncoding("UTF-8");// 判断是否为上传if (ServletFileUpload.isMultipartContent(request)) {// 初始一个DiskFileItemFactoryDiskFileItemFactory 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页面,