package com.cabletech.common.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.cabletech.business.base.model.UploadFile;
import com.cabletech.business.base.service.UploadFileService;
import com.cabletech.common.externalresources.ExternalResourcesAccessService;
import com.cabletech.common.util.SpringContext;
/**
* 上传文件servlet
*
* @author zhaobi
* @author 杨隽 2012-05-17 去除无用的导入、局部变量和类成员
*
*/
public class UploadServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 5625449244154552706L;
// spring context
public WebApplicationContext wac;
private Logger logger = Logger.getLogger(this.getClass());
/**
* 上传脸上文件
*/
public static String UPLOADTMP = "/tmp";
public static int SIZETHRESHOLD = 2048000;// 指定在内存中缓存数据大小
public static long SIZEMAX = 90000000; // 服务器最大上传文件尺寸
public static long IMAGEMAXSIZE = 307200;// 图片文件上传大小
public static long OTHERMAXSIZE = 10240000;// 上传文件大小
@SuppressWarnings("rawtypes")
private static Hashtable deniedExtensions;// 阻止的上传文件扩展名
@SuppressWarnings("rawtypes")
private static Hashtable allowedExtensions;// 允许的上传文件扩展名
File tmpDir = null;// 初始化上传文件的临时存放目录
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext application = getServletContext();
wac = WebApplicationContextUtils.getWebApplicationContext(application);// spring
ExternalResourcesAccessService externalAccessService = (ExternalResourcesAccessService) SpringContext
.getApplicationContext().getBean(
"externalResourcesAccessService"); // 上下文
UPLOADTMP = externalAccessService.getUploadtemp();
tmpDir = new File(UPLOADTMP);
if (!tmpDir.isDirectory()) {
tmpDir.mkdir();
}
allowedExtensions = new Hashtable(2);
deniedExtensions = new Hashtable(2);
allowedExtensions.put("File",
stringToArrayList(getInitParameter("AllowedExtensionsFile")));
deniedExtensions.put("File",
stringToArrayList(getInitParameter("DeniedExtensionsFile")));// 失效的扩张名文件
allowedExtensions.put("Image",
stringToArrayList(getInitParameter("AllowedExtensionsImage")));
deniedExtensions.put("Image",
stringToArrayList(getInitParameter("DeniedExtensionsImage")));
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
upload(request, response);
} catch (Exception e) {
logger.error(e);
}
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
upload(request, response);
} catch (Exception e) {
logger.error(e);
}
}
/**
* 上传方法
*
* @param request
* HttpServletRequest
* @param response
* HttpServletResponse
* @throws Exception
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
protected void upload(HttpServletRequest request,
HttpServletResponse response) throws Exception {
logger.info("操作类型:" + request.getParameter("type"));
String ctx = request.getContextPath();
String type = request.getParameter("type");
if (type.equals("upload")) {
List<FileItem> files = (List<FileItem>) request.getSession()
.getAttribute("FILES");
if (files == null) {
files = new ArrayList<FileItem>();
}
try {
if (ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory();// 创建该对象
factory.setRepository(tmpDir);// 指定上传文件的临时目录
factory.setSizeThreshold(SIZETHRESHOLD);// 指定在内存中缓存数据大小,单位为byte
ServletFileUpload upload = new ServletFileUpload(factory);// 创建该对象
upload.setSizeMax(SIZEMAX);// 指定一次上传多个文件的总尺寸
List items = upload.parseRequest(request);// 解析request
// 请求,并返回FileItemIterator集合
Iterator iter = items.iterator();
while (iter.hasNext()) {
// 从集合中获得一个文件流
FileItem item = (FileItem) iter.next();
if (!item.isFormField() && item.getName().length() > 0) {// 过滤掉表单中非文件域
logger.info("文件名称:" + item.getName());
logger.info("filesize:" + item.getSize());
String fileName = item.getName();
fileName = fileName.replace('\\', '/');
String[] pathParts = fileName.split("/");
fileName = pathParts[pathParts.length - 1];
// 获取文件扩展名
String ext = getExtension(fileName);
if (extIsAllowed("File", ext)) {
if (extIsAllowed("Image", ext)) {
if (item.getSize() <= IMAGEMAXSIZE) {
files.add(item);
} else {
outprint(response, "msg:图片大小不能大于300k");
}
} else {
if (item.getSize() <= OTHERMAXSIZE) {
files.add(item);
} else {
outprint(response, "msg:文件大小不能大于10M");
}
}
} else {
outprint(response, "msg:无效文件类型:" + ext);
}
}
}
request.getSession().setAttribute("FILES", files);
StringBuilder builder = new StringBuilder();
int i = 0;
for (FileItem item : files) {
String fileName = item.getName();
fileName = fileName.replace('\\', '/');
String[] pathParts = fileName.split("/");
fileName = pathParts[pathParts.length - 1];
builder.append("<a href='javascript:;' onclick='removefile(\""
+ i
+ "\")'><img src=\""
+ ctx
+ "/js/jQuery/jupload/del.gif\"/ border=\"0\" alt=\"移除\"></a> "
+ fileName + "<br>");// 终于成功了,还不到你的上传文件中看看,你要的东西都到齐了吗
i++;
}
outprint(response, builder.toString());
}
} catch (Exception e) {
logger.error(e);
outprint(response, "msg:上传的文件超过了设定大小");
}
} else if (type.equals("remove")) {
int index = Integer.parseInt(request.getParameter("delid"));
List<FileItem> files = (List<FileItem>) request.getSession()
.getAttribute("FILES");
if (files != null) {
FileItem fileitem = files.remove(index);
logger.info("删除成功" + fileitem.getName());
logger.info("list" + files.size());
}
StringBuilder builder = new StringBuilder();
int i = 0;
for (FileItem item : files) {
builder.append("<a href=\"javascript:;\" onclick='removefile(\""
+ i
+ "\")'><img src=\""
+ ctx
+ "/js/jQuery/jupload/del.gif\" border=\"0\" alt=\"移除\"/></a> "
+ item.getName() + "<br>");// 终于成功了,还不到你的上传文件中看看,你要的东西都到齐了吗
i++;
}
outprint(response, builder.toString());
} else if (type.equals("del")) {
int index = Integer.parseInt(request.getParameter("delid"));
List<FileItem> files = (List<FileItem>) request.getSession()
.getAttribute("FILES");
if (files != null) {
files.remove(index);
}
List<UploadFile> oldfiles = (List<UploadFile>) request.getSession()
.getAttribute("OLDFILE");
UploadFile file = oldfiles.remove(index);
UploadFileService uploadFileService = (UploadFileService) SpringContext
.getApplicationContext().getBean("uploadFileServiceImpl");
uploadFileService.delById(file.getFileId());
logger.info("删除成功" + file.getOriginalName());
logger.info("list" + oldfiles.size());
StringBuilder builder = new StringBuilder();
int i = 0;
for (UploadFile upfile : oldfiles) {
builder.append("<a class=\"upload\" href='javascript:;' onclick='del(\""
+ i
+ "\")'><img src=\""
+ ctx
+ "/js/jQuery/jupload/del.gif\" border=\"0\" alt=\"移除\"/></a>");
builder.append("<a href='/" + ctx
+ "/download!download.action&fileid="
+ upfile.getFileId() + "'><img border='0' src='/" + ctx
+ "/css/images/attachment.gif' width='15' height='15'>"
+ upfile.getOriginalName() + "</a><br>");
i++;
}
request.getSession().setAttribute("OLDFILE", oldfiles);
outprint(response, builder.toString());
}
}
/**
* 字符串向ArrayList转化的方法
*
* @param str
* String
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private ArrayList stringToArrayList(String str) {
String[] strArr = str.split("\\|");
ArrayList tmp = new ArrayList();
if (str.length() > 0) {
for (int i = 0; i < strArr.length; ++i) {
tmp.add(strArr[i].toLowerCase());
}
}
return tmp;
}
/**
* 获取扩展名的方法
*
* @param fileName
* String
*/
private String getExtension(String fileName) {
return fileName.substring(fileName.lastIndexOf(".") + 1);
}
/**
* 判断扩展名是否允许的方法
*
* @param fileType
* String
* @param ext
* String
*/
@SuppressWarnings("rawtypes")
private boolean extIsAllowed(String fileType, String ext) {
ext = ext.toLowerCase();
ArrayList allowList = (ArrayList) allowedExtensions.get(fileType);
ArrayList denyList = (ArrayList) deniedExtensions.get(fileType);
if (allowList.size() == 0) {
if (denyList.contains(ext)) {
return false;
} else {
return true;
}
}
if (denyList.size() == 0) {
if (allowList.contains(ext)) {
return true;
} else {
return false;
}
}
return false;
}
/**
* 输出
*
* @param response
* HttpServletResponse
* @param text
* String
*/
private void outprint(HttpServletResponse response, String text)
throws IOException {
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print(text);
out.flush();
}
}