首页 旅游资讯 线路攻略 景点大全 国内游 境外游 美食特产
您的当前位置:首页正文

AJAX实现基于WEB的文件上传的进度控制 - 服务端(2)

2022-09-24 来源:锐游网
2.1.3. 后台服务类(BackGroundService)

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); }

} } }

因篇幅问题不能全部显示,请点此查看更多更全内容