BackGroundService这个Servlet类负责接收Form Post数据、回应状态轮询请求、处理取消文件上传的请求。
尽管可以把这些功能相互分离开来,但为了简单明了,还是将它们放到Servlet中,只是由不同的方法进行分割。 源代码如下:
package liuzuochen.sample.upload;
import java.io.File;
import java.io.IOException; import java.util.List;
import javax.servlet.ServletException;
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.*;
public class BackGroundService extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
public static final String UPLOAD_DIR = \"/upload\";
public static final String DEFAULT_UPLOAD_FAILURE_URL = \"./result.jsp\";
public BackGroundService() { super(); }
protected void doGet(HttpServletRequest
request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); }
private String takeOutFileName(String filePath) { int pos = filePath.lastIndexOf(File.separator); if (pos > 0) {
return filePath.substring(pos + 1); } else {
return filePath; } }
public static FileUploadStatus getStatusBean( HttpServletRequest request) {
BeanControler beanCtrl = BeanControler.getInstance();
return beanCtrl.getUploadStatus(request.getRemoteAddr()); }
public static void saveStatusBean( HttpServletRequest request, FileUploadStatus statusBean) {
statusBean.setUploadAddr(request.getRemoteAddr());
BeanControler beanCtrl = BeanControler.getInstance(); beanCtrl.setUploadStatus(statusBean); }
private void deleteUploadedFile(HttpServletRequest request) { FileUploadStatus satusBean = getStatusBean(request);
for (int i = 0; i < satusBean.getUploadFileUrlList().size(); i++) { File uploadedFile = new File(request.getRealPath(UPLOAD_DIR) + File.separator
+ satusBean.getUploadFileUrlList(). get(i)); uploadedFile.delete(); }
satusBean.getUploadFileUrlList().clear(); satusBean.setStatus(\"删除已上传的文件\"); saveStatusBean(request, satusBean); }
private void uploadExceptionHandle( HttpServletRequest
request, String errMsg) throws ServletException, IOException { //首先删除已经上传的文件
deleteUploadedFile(request);
FileUploadStatus satusBean = getStatusBean(request);
satusBean.setStatus(errMsg);
saveStatusBean(request, satusBean); }
private FileUploadStatus initStatusBean(HttpServletRequest request) {
FileUploadStatus satusBean = new FileUploadStatus(); satusBean.setStatus(\"正在准备处理\");
satusBean.setUploadTotalSize(request.getContentLength()); satusBean.setProcessStartTime(System.currentTimeMillis()); satusBean.setBaseDir(request.getContextPath() + UPLOAD_DIR); return satusBean; }
private void processFileUpload(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory(); //设置内存缓冲区,超过后写入临时文件 factory.setSizeThreshold(10240000); //设置临时文件存储位置
factory.setRepository(new
File(request.getRealPath(\"/upload/temp\")));
ServletFileUpload upload = new ServletFileUpload(factory); //设置单个文件的最大上传值
upload.setFileSizeMax(102400000); //设置整个request的最大值
upload.setSizeMax(102400000);
upload.setProgressListener(new FileUploadListener(request)); //保存初始化后的FileUploadStatus Bean
saveStatusBean(request, initStatusBean(request));
String forwardURL = \"\"; try {
List items = upload.parseRequest(request); //获得返回url
for (int i = 0; i < items.size(); i++) { FileItem item = (FileItem) items.get(i); if (item.isFormField()) {
forwardURL = item.getString(); break;
} }
//处理文件上传
for (int i = 0; i < items.size(); i++) { FileItem item = (FileItem) items.get(i);
//取消上传
if (getStatusBean(request).getCancel()) { deleteUploadedFile(request); break; }
//保存文件
else if (!item.isFormField() && item.getName().length() > 0) { String fileName = takeOutFileName(item.getName());
File uploadedFile = new File(request.getRealPath(UPLOAD_DIR) + File.separator +
fileName); item.write(uploadedFile); //更新上传文件列表 FileUploadStatus
satusBean = getStatusBean(request); satusBean.getUploadFileUrlList().add(fileName); saveStatusBean(request, satusBean); Thread.sleep(500); } }
} catch (FileUploadException e) {
uploadExceptionHandle(request, \"上传文件时发生错误:\" + e.getMessage());
} catch (Exception e) {
uploadExceptionHandle(request, \"保存上传文件时发生错误:\" + e.getMessage()); }
if (forwardURL.length() == 0) {
forwardURL = DEFAULT_UPLOAD_FAILURE_URL; }
request.getRequestDispatcher(forwardURL).forward(request, response); }
private void responseStatusQuery(HttpServletRequest request,
HttpServletResponse response) throws IOException { response.setContentType(\"text/xml\");
response.setCharacterEncoding(\"UTF-8\");
response.setHeader(\"Cache-Control\
FileUploadStatus satusBean = getStatusBean(request); response.getWriter().write(satusBean.toJSon()); }
private void processCancelFileUpload(HttpServletRequest request,
HttpServletResponse response) throws IOException { FileUploadStatus satusBean = getStatusBean(request); satusBean.setCancel(true);
saveStatusBean(request, satusBean);
responseStatusQuery(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean isMultipart =
ServletFileUpload.isMultipartContent(request); if (isMultipart) {
processFileUpload(request, response); } else {
request.setCharacterEncoding(\"UTF-8\");
if (request.getParameter(\"uploadStatus\") != null) { responseStatusQuery(request, response); }
if (request.getParameter(\"cancelUpload\") != null) { processCancelFileUpload(request, response); }
} } }
因篇幅问题不能全部显示,请点此查看更多更全内容