⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 backgroundservice.java

📁 利用AJAX控制上传文件进度,并生成进度条! 同时增加了新的实现方法,详细信息还请使用者自己体会
💻 JAVA
字号:
package com.bjinfotech.practice.ajax;

import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

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.*;
import org.apache.log4j.Logger;

/**
 * Servlet implementation class for Servlet: BackGroundService
 *
 */
 public class BackGroundService extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
	 Logger logger=Logger.getLogger(BackGroundService.class);
	 
	 public static final String UPLOAD_STATUS="UPLOAD_STATUS";
	 public static final String UPLOAD_DIR="/upload";
	 public static final String DEFAULT_UPLOAD_FAILURE_URL="./result.jsp";
    /**
	 * 
	 */
	private static final long serialVersionUID = -432333786992722290L;

	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public BackGroundService() {
		super();
	}   	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}  	
	
	/**
	 * 从文件路径中取出文件名
	 * @param filePath
	 * @return
	 */
	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
	 * @param request
	 * @return
	 */
	public static FileUploadStatus takeOutFileUploadStatusBean(HttpSession session){
		Object obj=session.getAttribute(UPLOAD_STATUS);
		if (obj!=null){
			return (FileUploadStatus)obj;
		}
		else{
			return null;
		}
	}
	
	/**
	 * 把FileUploadStatus Bean保存到session
	 * @param request
	 * @param uploadStatusBean
	 */
	public static void storeFileUploadStatusBean(
			HttpSession session,
			FileUploadStatus uploadStatusBean){
		session.setAttribute(UPLOAD_STATUS,uploadStatusBean);
	}
	
	/**
	 * 删除已经上传的文件
	 * @param request
	 */
	private void deleteUploadedFile(HttpServletRequest request){
		FileUploadStatus fUploadStatus=takeOutFileUploadStatusBean(request.getSession());
		////logger.debug("删除已上传的文件");
		for(int i=0;i<fUploadStatus.getUploadFileUrlList().size();i++){
			File uploadedFile = new File(request.getRealPath(UPLOAD_DIR)+
					File.separator+fUploadStatus.getUploadFileUrlList().get(i));
			uploadedFile.delete();
		}
		fUploadStatus.getUploadFileUrlList().clear();
		fUploadStatus.setStatus("删除已上传的文件");
		storeFileUploadStatusBean(request.getSession(),fUploadStatus);
	}
	
	/**
	 * 上传过程中出错处理
	 * @param request
	 * @param errMsg
	 * @throws IOException 
	 * @throws ServletException 
	 */
	private void uploadExceptionHandle(
			HttpServletRequest request,
			String errMsg) throws ServletException, IOException{
		//首先删除已经上传的文件
		deleteUploadedFile(request);
		FileUploadStatus fUploadStatus=takeOutFileUploadStatusBean(request.getSession());
		fUploadStatus.setStatus(errMsg);
		storeFileUploadStatusBean(request.getSession(),fUploadStatus);
	}
	
	/**
	 * 初始化文件上传状态Bean
	 * @param request
	 * @return
	 */
	private FileUploadStatus initFileUploadStatusBean(HttpServletRequest request){
		FileUploadStatus fUploadStatus=new FileUploadStatus();
		fUploadStatus.setStatus("正在准备处理");
		fUploadStatus.setUploadTotalSize(request.getContentLength());
		fUploadStatus.setProcessStartTime(System.currentTimeMillis());
		fUploadStatus.setBaseDir(request.getContextPath()+UPLOAD_DIR);
		return fUploadStatus;
	}
	/**
	 * 处理文件上传
	 * @param request
	 * @param response
	 * @throws IOException 
	 * @throws ServletException 
	 */
	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);
		//设置单个文件的最大上传size
		upload.setFileSizeMax(10240000);
		//设置整个request的最大size
		upload.setSizeMax(10240000);
		upload.setProgressListener(new FileUploadListener(request.getSession()));
		//保存初始化后的FileUploadStatus Bean
		storeFileUploadStatusBean(request.getSession(),initFileUploadStatusBean(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()){
					////logger.debug("form Field["+item.getFieldName()+"]="+item.getString());
					forwardURL=item.getString();
					break;
				}
			}
			//处理文件上传
			for(int i=0;i<items.size();i++){
				FileItem item=(FileItem)items.get(i);

				//取消上传
				if (takeOutFileUploadStatusBean(request.getSession()).getCancel()){
					deleteUploadedFile(request);
					break;
				}
				//保存文件
				else if (!item.isFormField() && item.getName().length()>0)
				{
					String fileName=takeOutFileName(item.getName());
					////logger.debug("处理文件["+fileName+"]:保存路径为"
					//		+request.getRealPath(UPLOAD_DIR)+File.separator+fileName);
					File uploadedFile = new File(request.getRealPath(UPLOAD_DIR)+File.separator+fileName);
					item.write(uploadedFile);
					//更新上传文件列表
					FileUploadStatus fUploadStatus=takeOutFileUploadStatusBean(request.getSession());
					fUploadStatus.getUploadFileUrlList().add(fileName);
					storeFileUploadStatusBean(request.getSession(),fUploadStatus);
					Thread.sleep(500);
				}
			}
		
		} catch (FileUploadException e) {
			logger.error("上传文件时发生错误:"+e.getMessage());
			e.printStackTrace();
			uploadExceptionHandle(request,"上传文件时发生错误:"+e.getMessage());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.error("保存上传文件时发生错误:"+e.getMessage());
			e.printStackTrace();
			uploadExceptionHandle(request,"保存上传文件时发生错误:"+e.getMessage());
		}
		if (forwardURL.length()==0){
			forwardURL=DEFAULT_UPLOAD_FAILURE_URL;
		}
		request.getRequestDispatcher(forwardURL).forward(request,response);
	}
	/**
	 * 回应上传状态查询
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void responseFileUploadStatusPoll(HttpServletRequest request,HttpServletResponse response) throws IOException{
		response.setContentType("text/xml");
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Cache-Control", "no-cache");
		//logger.debug("发送上传状态回应");
		response.getWriter().write(XmlUnSerializer.serializeBean(
				request.getSession().getAttribute(UPLOAD_STATUS)));
	}
	/**
	 * 处理取消文件上传
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void processCancelFileUpload(HttpServletRequest request,HttpServletResponse response) throws IOException{
		FileUploadStatus fUploadStatus=(FileUploadStatus)request.getSession().getAttribute(UPLOAD_STATUS);
		fUploadStatus.setCancel(true);
		request.getSession().setAttribute(UPLOAD_STATUS, fUploadStatus);
		responseFileUploadStatusPoll(request,response);
	}
	
	/**
	 * 在上传文件列表中查找与文件名相关的id
	 * @param request
	 * @param fileName 文件名
	 * @return 找到返回id,否则返回-1
	 */
	private int findFileIdInFileUploadedList(HttpServletRequest request,String fileName){
		FileUploadStatus fileUploadStatus=takeOutFileUploadStatusBean(request.getSession());
		for(int i=0;i<fileUploadStatus.getUploadFileUrlList().size();i++){
			if (fileName.equals((String)fileUploadStatus.getUploadFileUrlList().get(i))){
				return i;
			}
		}
		return -1;
	}
	
	/**
	 * 下载文件
	 * @param request 其中downFile参数值为下载文件名
	 * @param response
	 * @throws IOException
	 */
	private void downloadFile(HttpServletRequest request,HttpServletResponse response) throws IOException{
		response.setHeader("Cache-Control", "no-cache");
		response.setContentType("application/octet-stream; CHARSET=utf8");
		String fileName=PlainURLEncoder.decode(request.getParameter("downFile"));
		
		if (findFileIdInFileUploadedList(request,fileName)!=-1){
			response.setHeader("Content-Disposition","attachment; filename="+
					java.net.URLEncoder.encode(fileName,"UTF-8"));
	//		//logger.debug(java.net.URLEncoder.encode(fileName,"UTF-8"));
			File uploadedFile = new File(request.getRealPath(UPLOAD_DIR)+File.separator+fileName);
			
			DataInputStream is=new DataInputStream(new FileInputStream(uploadedFile));
			DataOutputStream os=new DataOutputStream(response.getOutputStream());
			byte[] readBytes=new byte[128];
			while(is.read(readBytes)!=-1){
				os.write(readBytes);
			}
			os.close();  
			is.close();  
		}
	}
	
	/**
	 * 删除文件
	 * @param request 其中deletedFile参数值为删除文件名
	 * @param response
	 * @throws IOException 
	 * @throws ServletException 
	 * @throws IOException
	 */
	private void deleteFile(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
		response.setContentType("text/xml");
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Cache-Control", "no-cache");
		//logger.debug("发送删除文件回应");
		InteractionMessage im=new InteractionMessage();
		String fileName=PlainURLEncoder.decode(request.getParameter("deleteFile"));
		
		int fileId=findFileIdInFileUploadedList(request,fileName);
		File deletedFile = new File(request.getRealPath(UPLOAD_DIR)+File.separator+fileName);
		if (deletedFile.delete()){
			FileUploadStatus fileUploadStatus=takeOutFileUploadStatusBean(request.getSession());
			fileUploadStatus.getUploadFileUrlList().remove(fileId);
			storeFileUploadStatusBean(request.getSession(), fileUploadStatus);
			im.setMsg("删除文件["+fileName+"]成功!");
		}
		else{
			im.setMsg("删除文件["+fileName+"]失败!");
		}
		response.getWriter().write(XmlUnSerializer.serializeBean(im)); 
	}
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 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){
				responseFileUploadStatusPoll(request,response);
			}
			if (request.getParameter("cancelUpload")!=null){
				processCancelFileUpload(request,response);
			}
			if (request.getParameter("downFile")!=null){
				downloadFile(request,response);
			}
			if (request.getParameter("deleteFile")!=null){
				deleteFile(request,response);
			}
		}
	}   	  	    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -