现在文件的上传,特别是大文件上传,都需要进度条,让客户知道上传进度。
本文简单记录下如何弄进度条,以及一些上传信息,比如文件的大小,上传速度,预计剩余时间等一些相关信息。代码是匆忙下简单写的,一些验证没做,或代码存在一些隐患,不严谨的地方。本文代码只供参考。
进度条的样式多种多样,有些网站弄得非常绚烂漂亮。本文UI端不太懂,只会一些简单的基本的css而已,所以进度条弄得不好看。本文侧重的给读者提供一个参考,一个实现思路而已。
注:由于jQuery版本用的是2.1.1,所以如果跑本例子源码,请用IE9以上或火狐、谷歌浏览器测试。
接收文件上传的servlet
UploadFileServlet.Java
package com.fei.servlet; import java.io.IOException; import java.util.Date; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.fei.util.FileUploadUtil; public class UploadFileServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { long start = System.currentTimeMillis(); System.out.println("开始上传文件........." ); Map<String, String> params = FileUploadUtil.upload(request); System.out.println("文件上传完成........." ); System.out.println("文件上次用时:"+(System.currentTimeMillis()-start)+"毫秒"); } catch (Exception e) { e.printStackTrace(); } } }
将上传文件进行下载到服务器的处理
FileUploadUtil.java
package com.fei.util; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadUtil { /** * 文件上传保存路径 */ private static final String SAVE_FILEPATH = "/fileupload/"; /** * 文件上传临时保存路径 */ private static final String SAVE_FILE_TMPPATH = "/fileupload/tmp/"; /** * 上传文件的最大值M */ private static final int MAX_FILE_SIZE = 100*1024*1024; /** * 文件数据在内存中超过多少M后,就写入临时文件 */ private static final int THRESHOLD_SIZE = 2*1024*1024; private static final String ENCODING = "UTF-8"; /** * 处理文件上传的表单 * 下载文件,并返回文件名称及普通表单域中其它属性值 * 获取文件名 */ public static Map<String,String> upload(HttpServletRequest request)throws Exception{ Map<String,String> params = new HashMap<String, String>(); String savePath = request.getSession().getServletContext() .getRealPath(SAVE_FILEPATH)+ File.separator; String savePathTemp = request.getSession().getServletContext() .getRealPath(SAVE_FILE_TMPPATH)+ File.separator; File saveFileTempDir = new File(savePathTemp); DiskFileItemFactory factory = new DiskFileItemFactory(); //当内存中文件数据达到THRESHOLD_SIZE后,就写入临时文件中,避免上传大文件时,消化太多内存 factory.setSizeThreshold(THRESHOLD_SIZE); factory.setRepository(saveFileTempDir); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding(ENCODING); upload.setSizeMax(MAX_FILE_SIZE); FileUploadInfo fileUploadInfo = new FileUploadInfo(); upload.setProgressListener(new FileUploadListener(fileUploadInfo)); request.getSession().setAttribute("uploadInfo", fileUploadInfo); List items = upload.parseRequest(request); Iterator iter = items.iterator(); int fileNum = 1; while(iter.hasNext()){ FileItem item = (FileItem) iter.next(); if (item.isFormField()) {//普通表单域 params.put(item.getFieldName(), item.getString()); } else { String fileName = item.getName().replace("https://www.jb51.net/", "\\"); int i = fileName.lastIndexOf("\\"); fileName = fileName.substring(i+1); //避免重复 fileName = System.currentTimeMillis() + fileName; File uploadedFile = new File(savePath + fileName); item.write(uploadedFile); params.put("fileName0"+fileNum, fileName); fileNum ++; } } return params; } } class FileUploadListener implements ProgressListener{ FileUploadInfo fileUploadInfo = null; public FileUploadListener(FileUploadInfo fileUploadInfo) { this.fileUploadInfo = fileUploadInfo; } @Override public void update(long uploadSize, long totalSize, int itemNum) { this.fileUploadInfo.setTotalSize(totalSize); this.fileUploadInfo.setUploadSize(uploadSize); } }
上传文件的一些信息
FileUploadInfo.java