liss 发表于 2013-2-6 10:08:04

AJAX+JSP实现基于WEB的文件上传的进度控制(2)

2.1.3. 后台服务类(BackGroundService)
   BackGroundService这个Servlet类负责接收Form Post数据、回应状态轮询请求、处理取消文件上传的请求。 尽管可以把这些功能相互分离开来,但为了简单明了,还是将它们放到Servlet中,只是由不同的方法进行分割。 源代码如下:
/** * 本例程演示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。 * 如果需要转载本例程,请您注明作者。 * * 作者: 刘作晨 * EMail:liuzuochen@gmail.com */package liuzuochen.sample.upload;/** * Title: 后台服务 * * Description: 为客户端提供上传及文件传输状态查询服务 * */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;         }     }     /**      * 从request中取出FileUploadStatus Bean      */     public static FileUploadStatus getStatusBean(             HttpServletRequest request) {         BeanControler beanCtrl = BeanControler.getInstance();         return beanCtrl.getUploadStatus(request.getRemoteAddr());     }     /**      * 把FileUploadStatus Bean保存到类控制器BeanControler      */     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);     }     /**      * 初始化文件上传状态Bean      */     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.setHeader("Cache-Control", "no-cache");         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);             }         }     }}   2.1.4. 文件上传状态控制类(BeanControler)
页: [1]
查看完整版本: AJAX+JSP实现基于WEB的文件上传的进度控制(2)