利用apache的Commons-fileupload和Ajax实现文件上传进度条

实现思路:

1、首先自定义一个进度坚挺实现类ProgressListener接口,重写upload方法。

2、通过以读取的字节数跟文件总的字节数生成百分比,将值放到session中

3、创建一个servlet用来获取session中的百分比

4、在上传文件界面,在表单提交时,Ajax每个100毫秒访问第三步中创建的servlet响应的百分比值,显示在界面。

参考代码:

自定义监听类实现ProgressListener

package cn.progressBar;

import java.text.NumberFormat;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.ProgressListener;

/**
 * 自定义监听类实现ProgressListener
 * @author l
 *
 */
//@WebListener
public class MyProgressListener implements ProgressListener{

	private double megaBytes = -1;
	private HttpSession session;
	
	public MyProgressListener(){
		
	}
	
	public MyProgressListener(HttpServletRequest request){
		session = request.getSession();
	}
	
	@Override
	public void update(long pBytesRead, long pContentLength, int pItems) {
		// TODO Auto-generated method stub
		double mBytes = pBytesRead / (1024*1024);  //pBytesRead到目前为止读取文件的比特数
        double total=pContentLength/(1024*1024);  //pContentLength 文件总大小
           if (megaBytes == mBytes) {  
               return;  
           }  
           System.out.println("文件总大小:"+total+"M");  
           System.out.println("已读取:"+mBytes+"M");  
           megaBytes = mBytes;  
           System.out.println("目前正在读取第几个文件 " + pItems);  //pItems目前正在读取第几个文件
           if (pContentLength == -1) {  
               System.out.println("So far, " + pBytesRead + " bytes have been read.");  
           } else {  
               System.out.println("So far, " + pBytesRead + " of " + pContentLength  
                                  + " bytes have been read.");  
              double read=(mBytes/total);  
              NumberFormat nf=NumberFormat.getPercentInstance();  
              System.out.println("read===>"+nf.format(read));//生成读取的百分比 并放入session中  
              session.setAttribute("read", nf.format(read));  
           }  
	}

}
封装FileUpload 用来接收request中的表单域 和 file文件域
package cn.progressBar;

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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUpload {  
    private Map<String,String> params;  
    private Map<String,FileItem> files;  
      
    public FileUpload() {  
        params=new HashMap<String, String>();  
        files=new HashMap<String, FileItem>();  
    }  
      
	@SuppressWarnings("rawtypes")
	public void setMap(HttpServletRequest request){  
        // Create a factory for disk-based file items  
        FileItemFactory factory = new DiskFileItemFactory();  
        // Create a new file upload handler  
        ServletFileUpload upload = new ServletFileUpload(factory);  
        upload.setHeaderEncoding("utf-8");  
        upload.setProgressListener(new MyProgressListener(request));//设置进度监听器  
        // Parse the request  
        try {  
            List items = upload.parseRequest(request);  
            Iterator iter = items.iterator();  
            while (iter.hasNext()) {  
                FileItem item = (FileItem) iter.next();  
                if (item.isFormField()) {  
                    String name = item.getFieldName();  
                    String value = item.getString();  
                    params.put(name, value);  
                }   
                else{  
                    String name=item.getFieldName();  
                    files.put(name, item);  
                }  
            }  
        } catch (FileUploadException e) {  
            e.printStackTrace();  
        }  
    }  
  
    public Map<String, String> getParams() {  
        return params;  
    }  
  
    public Map<String, FileItem> getFiles() {  
        return files;  
    }  
    //用来获取文件的名字  
    public String getFileName(FileItem item){  
        String fName=item.getName();  
        System.out.println("fname=====>"+fName);  
        int lastIndex=fName.lastIndexOf("\\");  
        fName=fName.substring(lastIndex+1);  
        System.out.println("new fname=====>"+fName);  
        return fName;  
    }  
}  
实现上传文件servlet

package cn.progressBar;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet {
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");  
        PrintWriter out = response.getWriter();  
        FileUpload fu=new FileUpload();  
        fu.setMap(request);//解析request  
        Map<String,FileItem> files=fu.getFiles();  
        String fileName =fu.getFileName(files.get("file"));  
        File file=new File(this.getServletContext().getRealPath("upload\\"+fileName));  
        try {  
              
            files.get("file").write(file);  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        out.println("<script>alert('上传成功!');history.go(-1);</script>");
	}

}
实现用来响应上传进度的servlet FileUploadStatus

package cn.progressBar;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/FileUploadStatus")
public class FileUploadStatus extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("--------------------------------------------------------------------------------------------------------------------------");
		response.setContentType("text/html;charset=utf-8");  
        PrintWriter out = response.getWriter();  
        HttpSession session=request.getSession();  
          
        String status=(String) session.getAttribute("read");//获取上传进度百分比  
        System.out.println(status+"FileUploadStatus");  
        out.println(status);//响应
	}

}
index.jsp 完整内容

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.0.js"></script>
<script type="text/javascript">
	function callback() {
		//alert("=======");
		//alert("*********************");
		$.ajax({
			//http://localhost:8080/progressBar/index.jsp
			type : "POST",
			url : "FileUploadStatus",//响应文件上传进度的servlet  FileUploadStatus
			
			success : function(msg) {
				//document.getElementById("span").innerHTML = msg;//显示读取百分比  已上传
				//document.getElementById("table").width = msg;//通过表格宽度 实现进度条
				var bl = parseInt(msg);
				//alert(bl);
				 if(bl<20 && bl >=0){
					 $("#show").html("<div style='width:"+msg+";background-color: #f90;border-radius:8px;text-align:right'>"+msg+"</div>");
				}
				 
				if(bl<40 && bl >=20){
					$("#show").html("<div style='width:"+msg+";background-color: #c90;border-radius:8px;text-align:right'>"+msg+"</div>");	
				}
				if(bl<60 && bl >=40){
					$("#show").html("<div style='width:"+msg+";background-color: #990;border-radius:8px;text-align:right'>"+msg+"</div>");
				}
				if(bl<75 && bl >=60){
					$("#show").html("<div style='width:"+msg+";background-color: #690;border-radius:8px;text-align:right'>"+msg+"</div>");
				}
				if(bl<90 && bl >=75){
					$("#show").html("<div style='width:"+msg+";background-color: #390;border-radius:8px;text-align:right'>"+msg+"</div>");
				}
				if(bl<=100 && bl >=90){
					$("#show").html("<div style='width:"+msg+";background-color: #090;border-radius:8px;text-align:right'>"+msg+"</div>");
				} 
				//$("#show").html("<div style='width:"+msg+";background-color: orange;border-radius:8px;text-align:right'>"+msg+"</div>");
			}
		});
	}
	
	function formSubmit(){
        window.setInterval("callback()", 10);//每隔100毫秒执行  
        document.form.submit();
    } 
	
</script>

</head>
<body>
	<form action="FileUploadServlet" method="post"
		enctype="multipart/form-data" target="_parent" name="form">
		<input type="file" name="file" ><input type="button" οnclick="formSubmit()" value="提交">
	</form>
	<!-- <span id="span"></span> -->
	<!-- <table width="300px;" border="0">
		<tr>
			<td>
				<table id="table" height="30px" style="background-color: gray;">
					<tr>
						<td align="right"><span id="span"></span></td>
					</tr>
				</table>
				实现进度条的显示
			</td>
		</tr>
	</table> -->
	
	<div style="width:300px;border-radius:8px;" id="show">
		   
	</div>
</body>
</html>

效果图:

注:不要忘了引用jquery


参考:http://blog.csdn.net/hxlzpnyist/article/details/7601611


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值