package com.cnblogs.xmc5788;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* servlet 实现多文件上传
*/
public class FileUpload extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* 缺省构造函数
*/
public FileUpload() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=gb2312"); //设置文件头形式
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e1) {
e1.printStackTrace();
}
// 得到该应用下的upload目录在服务器上的绝对路径
String path = request.getSession().getServletContext().getRealPath("upfile");
if (path == null) {// 如果为空表示不能访问,可能是系统设置了访问权限
out.print("无法访问该目录!");
return;
}
File uploadDir = new File(path);// 得到该目录的文件对象
if (!uploadDir.exists()) {// 判断该目录是否存在
if (!uploadDir.mkdir()) {// 如果不存在就建立该目录
out.print("无法创建该目录!");// 如果建立失败,给出提示
return;
}
}
if (!ServletFileUpload.isMultipartContent(request)) {
out.print("只能 multipart/form-data 类型数据");
return;
}
// 创建 DiskFileItemFactory 对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// factory.setRepository(tempDir);可以设置缓存目录
factory.setSizeThreshold(1024 * 1024);// 超过1m的数据采用临时文件缓存
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024 * 1024 * 2);// 单个文件大小
upload.setHeaderEncoding("gb2312");// 设置普通字段名称和文件字段的文件名所采用的字符集编码
upload.setSizeMax(1024 * 1024 * 4);// 最多上传2m的文件
List<FileItem> list = null;
try {
list = upload.parseRequest(request); //解析request对象 得到一个FileItem对象
} catch (FileUploadException e) {
out.print("解析文件时出现问题:");
e.printStackTrace();
return;
}
Iterator<FileItem> it = list.iterator();// 遍历list
while (it.hasNext()) {
FileItem fi = (FileItem) it.next();// 类型转换
System.out.println("该文件表单name为:" + fi.getFieldName());
System.out.println("该文件文件名为:" + fi.getName());
System.out.println("该文件文件类型为:" + fi.getContentType());
System.out.println("该文件文件大小为:" + fi.getSize());
if (fi.isFormField()) {// 判断该 FileItem 对象是否是一个普通表单类型
String name = fi.getFieldName();// 得到普通表单类型的表单名
String content = null;
try {
content = fi.getString("GB2312");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 用指定编码得到普通表单的值
request.setAttribute(name, content);// 把键值放入 request 对象
} else {
try {
String pathStr = fi.getName();// 得到文件表单的值,就是用户本地的文件路径
// 如果文件表单为空,则不处理
if (pathStr.trim().equals("")) {
continue;
}
int start = pathStr.lastIndexOf("\\");// 得到文件名在路径中的位置
String fileName = pathStr.substring(start + 1);// 得到文件名
File pathDest = new File(path, fileName);
System.out.println(fileName);
fi.write(pathDest);// 写文件
String name = fi.getFieldName();// 得到文件表单的名称
request.setAttribute(name, fileName);// 把表单名、文件名放入 request
} catch (Exception e) {
out.print("存储文件错误:");
e.printStackTrace();
return;
} finally {// 立即删除保存表单字段内容的临时文件
fi.delete();
}
}
}
}
}