package com.tarena.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import com.tarena.ajax.upload.MonitoredDiskFileItemFactory;
import com.tarena.ajax.upload.UploadListener;
public class FileUploadServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public FileUploadServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// upload file
upload(request, response);
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>Upload result</TITLE></HEAD>");
out.println(" <BODY>");
out.print("<h1 align=center>文件上传成功!</h1>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occure
*/
public void init() throws ServletException {
// Put your code here
}
private void upload(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// 用于存放上传文件的目录
String uploadPath = "C:\\upload\\";
// 创建了一个监听器,用来监听文件上传的状态
// 进度条是通过这个监听器来动态改变的
UploadListener listener = new UploadListener(request, 30);
// (1)Create a factory for disk-based file items
FileItemFactory factory = new MonitoredDiskFileItemFactory(listener);
// (2)Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
try { // 允许上传的文件大小,4G
upload.setSizeMax(4 * 1024 * 1024 * 1024);
// (3) process uploads ..
List uploadlist = upload.parseRequest(request);
// 开始读取上传信息
Iterator iter = uploadlist.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
// 忽略其他不是文件域的所有表单信息
// 取到客户端完整 路径+文件名 c:/abc.jpg
String fullpath = item.getName();
// 取到 文件名 abc.jpg
String filename = FilenameUtils.getName(fullpath);
// 取到文件类型 jpg
String filetype = getFiletype(filename);
// 判断是否有非法的文件类型
boolean flag = false;
// 过滤掉的文件类型
String[] errorType = { "exe", "com", "cgi", "jsp" };
for (int i = 0; i <= errorType.length - 1; i++) {
if (filetype.equals(errorType[i])) {
flag = true;
}
}
if (flag)
// 如果有非法文件,退出
break;
if (!filename.equals("")) {
// 文件重命名
File path = new File(uploadPath);
if (!path.exists()) {
// 目录不存在则创建
path.mkdir();
}
String savepath = uploadPath + filename;
System.out.println("savepath is " + savepath);
File saveFilepath = new File(savepath);
item.write(saveFilepath);
} else {
System.out.print("没东西!");
}
}
}
} catch (FileUploadBase.SizeLimitExceededException e) {
System.out.println("文件太大了吧!");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 取文件名后缀
private String getFiletype(String fileName) {
String type = "";
if (fileName == null || fileName.equals(""))
return type;
int position = fileName.lastIndexOf(".");
if (position != -1) {
type = fileName.substring(position + 1, fileName.length());
}
return type;
}
}