群里的朋友无聊,于是出了题目大家一起做,原理很简单
用第三方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)) {
// 初始一个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页面,