📄 backgroundservice.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 + -