帶有進度條監聽事件的文件上傳


第一種方法:(利用jquery中自帶的xhr屬性)

jsp頁面代碼:

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>文件上傳監聽</title>
 5 </head>
 6 <style>
 7     #box{
 8         width: 300px;
 9         height: 20px;
10         border: 1px solid black;
11     }
12     #content{
13         width: 0%;
14         height: 20px;
15         background: green;
16         margin-top: -10px;
17     }
18 </style>
19 <script src="js/jquery-1.11.3.min.js"></script>
20 <body>
21 <form id="frm" action="#" method="post">
22     <p><input type="file" name="file" ></p>
23     <p><input id="btn" type="button" value="提交"></p>
24 </form>
25 <p id="p"></p>
26 <div id="box">
27     <div id="content"></div>
28 </div>
29 
30 </body>
31 <script>
32     $(function(){
33         $("#btn").click(function(){
34             var formData=new FormData($("#frm")[0]);
35             $.ajax({
36                 url:"listenerUpload.do",
37                 type:"post",
38                 data:formData,
39                 dataType:"json",
40                 contentType:false,
41                 processData:false,
42                 xhr:function(){
43                     var myXhr=$.ajaxSettings.xhr();
44                     if(myXhr.upload){
45                         myXhr.upload.addEventListener("progress",function(event){
46                             var loadedSize=event.loaded;
47                             var loadSize=event.total;
48                             var precent=Math.floor(100*(loadedSize/loadSize))+"%";
49                             $("#content").css("width",precent);
50                         },false);
51                     }
52                     return myXhr;
53                 },
54                 success:function(result){
55                     if(result.data=="success"){
56                         $("#p").text("上傳成功!");
57                     }else{
58                         $("#p").text("上傳失敗!");
59                     }
60                 },
61                 error:function(){
62                     alert("服務器內部錯誤!");
63                 }
64             });
65         });
66 
67     })
68 </script>
69 </html>

 

servlet代碼:

 1 package servlet;
 2 
 3 import com.alibaba.fastjson.JSONObject;
 4 import org.apache.commons.fileupload.FileItem;
 5 import org.apache.commons.fileupload.FileUploadException;
 6 import org.apache.commons.fileupload.ProgressListener;
 7 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 8 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 9 
10 import javax.servlet.ServletException;
11 import javax.servlet.annotation.WebServlet;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import java.io.File;
16 import java.io.IOException;
17 import java.io.PrintWriter;
18 import java.util.List;
19 import java.util.UUID;
20 
21 @WebServlet(value = "/listenerUpload.do")
22 public class ListenerUploadServlet extends HttpServlet {
23     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
24         PrintWriter out=response.getWriter();
25         JSONObject jsonObject=new JSONObject();
26         boolean flag=false;
27         if(ServletFileUpload.isMultipartContent(request)){
28             DiskFileItemFactory factory=new DiskFileItemFactory();
29             factory.setSizeThreshold(1024000000);
30             factory.setRepository(new File("D:\\res"));
31             ServletFileUpload upload=new ServletFileUpload(factory);
32             upload.setFileSizeMax(1024000000);
33             upload.setSizeMax(1024000000);
34             ProgressListener progressListener=new ProgressListener() {
35                 @Override
36                 public void update(long readByte, long totalByte, int i) {
37                     System.out.println("已讀字節:"+readByte+",總字節數:"+totalByte+",文件序號:"+i);
38                 }
39             };
40             upload.setProgressListener(progressListener);
41             try {
42                 List<FileItem> fileItems=upload.parseRequest(request);
43                 for(FileItem f:fileItems){
44                     if(!f.isFormField()){
45                         File file=new File("D:\\upload\\"+ UUID.randomUUID()+f.getName().substring(f.getName().lastIndexOf(".")));
46                         f.write(file);
47                         flag=true;
48                     }else{
49                         System.out.println("表單名:"+f.getFieldName()+" 輸入值:"+f.getString("UTF-8"));
50                     }
51                 }
52             } catch (FileUploadException e) {
53                 e.printStackTrace();
54             } catch (Exception e){
55                 e.printStackTrace();
56             }
57         }
58         if(flag){
59             jsonObject.put("data","success");
60         }else{
61             jsonObject.put("data","error");
62         }
63         out.write(jsonObject.toString());
64     }
65 
66     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
67         this.doPost(request,response);
68     }
69 }

 

第二種方法:通過session存儲文件上傳進度

jsp頁面代碼:

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>文件上傳</title>
 5     <script src="js/jquery-1.11.3.min.js"></script>
 6     <script>
 7         //編寫jQuery語句
 8         $(function () {
 9             var flag;
10             $("[type=button]").click(function () {
11                 var formDate=new FormData($("#frm")[0]);
12                 $.ajax({
13                     type:"post",
14                     url:"UploadServlet",
15                     data:formDate,
16                     dataType:"json",
17                     contentType:false,
18                     processData:false,
19                     success:function (result) {
20                         flag=result.data;
21                         /*if(result.data=="1" && $("#proInfo").text()=="上傳進度:100%"){
22                             alert("上傳成功!")
23                         }*/
24                     },
25                     error:function () {
26                         alert("服務器內部錯誤!");
27                     }
28                 });
29 
30                 var pro=null;
31                 pro=setInterval(function(){
32                     $.get("UploadServlet","",function(data){
33                         if(data=='100%'){
34                             clearInterval(pro);
35                             $("#proInfo").text("上傳進度:100%");
36                             //更新進度條
37                             $("#progress").width("100%");
38 
39                             setTimeout(function () {
40                                 if(flag=="1"){
41 
42                                     alert("上傳成功!");
43                                 }
44                             },300);
45 
46 
47                         }else{//正在上傳
48                             //更新進度信息
49                             $("#proInfo").text("上傳進度:"+data);
50                             //更新進度條
51                             $("#progress").width(data);
52                         }
53                     });
54                 },200);
55             });
56 
57 
58         });
59     </script>
60     <style>
61         #progressBar{width: 300px;height: 20px;border: 1px #EEE solid;}
62         #progress{width: 0%;height: 20px;background-color: green;}
63     </style>
64 </head>
65 <body>
66 <form id="frm" method="post">
67     <p><input type="file" name="ff"></p>
68     <p>
69         <input type="button" value="上傳">
70         <div id="progressBar">
71             <div id="progress"></div>
72         </div>
73         <span id="proInfo">上傳進度:0%</span>
74     </p>
75 </form>
76 
77 </body>
78 </html>

 

servlet代碼:

 1 package servlet;
 2 
 3 
 4 import test.MyProgressListener;
 5 import net.sf.json.JSONObject;
 6 import org.apache.commons.fileupload.FileItem;
 7 import org.apache.commons.fileupload.FileUploadException;
 8 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 9 import org.apache.commons.fileupload.servlet.ServletFileUpload;
10 
11 import javax.servlet.ServletException;
12 import javax.servlet.annotation.WebServlet;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import java.io.File;
17 import java.io.IOException;
18 import java.io.PrintWriter;
19 import java.util.List;
20 import java.util.UUID;
21 
22 @WebServlet(value = "/UploadServlet")
23 public class UploadServlet extends HttpServlet {
24     @Override
25     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
26         //取出監聽器MyProgress在session中保存的進度信息
27         String progress=(String) request.getSession().getAttribute("progress");
28         //響應
29         response.getWriter().print(progress);
30         //清除session中保存的數據
31        //request.getSession().removeAttribute("progress");
32     }
33 
34     @Override
35     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
36        response.setContentType("text/html");
37         PrintWriter out = response.getWriter();
38         JSONObject json=new JSONObject();
39         /**
40          * 1.判斷請求是否為multipart
41          * 2.創建磁盤工廠,設置內存大小和臨時存儲位置
42          * 3.創建ServletFileUpload設置單個文件上傳大小以及整個request域大小
43          * 4.創建ProgressListener對象監聽文件上傳進度
44          * 5.解析request域
45          */
46         int sign=0;
47         //判斷請求是否為multipart
48         if(ServletFileUpload.isMultipartContent(request)){
49             //創建磁盤工廠,設置內存大小和臨時存儲位置
50             DiskFileItemFactory factory=new DiskFileItemFactory();
51             //factory.setSizeThreshold(10240000);
52             //如果文件大小大於內存大小則存儲在臨時存儲空間
53             factory.setRepository(new File("D:\\res"));
54             //創建ServletFileUpload設置單個文件上傳大小以及整個request域大小
55             ServletFileUpload upload=new ServletFileUpload(factory);
56             //upload.setFileSizeMax(10240000);
57             //upload.setSizeMax(10240000);
58             //創建ProgressListener對象監聽文件上傳進度
59             upload.setProgressListener(new MyProgressListener(request));
60 
61             //解析request域
62             try {
63                 List<FileItem> fileItems=upload.parseRequest(request);
64                 for (FileItem f:fileItems){
65                     if(!f.isFormField()){//判斷是否是普通表單域,如果是普通表單域則解析不了
66                         File file=new File("D:\\upload\\"+ UUID.randomUUID()+f.getName().substring(f.getName().lastIndexOf(".")));
67                         f.write(file);
68                         sign++;
69                         json.put("data",sign);
70                     }else {
71                         System.out.println("表單名:"+f.getFieldName()+"    輸入值:"+f.getString("UTF-8"));
72                     }
73                 }
74             } catch (FileUploadException e) {
75                 e.printStackTrace();
76             } catch (Exception e){
77                 e.printStackTrace();
78             }
79         }
80         out.write(json.toString());
81 
82 }
83 }

 

監聽器MyProgressListener類代碼:

 1 package test;
 2 
 3 import org.apache.commons.fileupload.ProgressListener;
 4 
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpSession;
 7 import java.text.NumberFormat;
 8 
 9 
10 public class MyProgressListener implements ProgressListener {
11 
12     private HttpSession session;
13     public MyProgressListener(HttpServletRequest request){
14         session = request.getSession();
15     }
16 
17     @Override
18     public void update(long pBytesRead, long pContentLength, int pItems) {
19         //將數據進行格式化
20         //已讀取數據由字節轉換為M
21         double readM=pBytesRead/1024.0/1024.0;
22         //已讀取數據由字節轉換為M
23         double totalM=pContentLength/1024.0/1024.0;
24         //已讀取百分百
25         double percent=readM/totalM;
26 
27         //格式化數據
28         //已讀取
29         String readf=dataFormat(pBytesRead);
30         //總大小
31         String totalf=dataFormat(pContentLength);
32         //進度百分百
33         NumberFormat format=NumberFormat.getPercentInstance();
34         String progress=format.format(percent);
35 
36         //將信息存入session
37         session.setAttribute("progress", progress);
38 
39         //打印消息到控制台
40         System.out.println("pBytesRead===>"+pBytesRead);
41         System.out.println("pContentLength==>"+pContentLength);
42         System.out.println("pItems===>"+pItems);
43         System.out.println("readf--->"+readf);
44         System.out.println("totalf--->"+totalf);
45         System.out.println("progress--->"+progress);
46     }
47 
48     /**
49      * 格式化讀取數據的顯示
50      * @param data 要格式化的數據 單位byte
51      * @return 格式化后的數據,如果小於1M顯示單位為KB,如果大於1M顯示單位為M
52      */
53     public String dataFormat(double data){
54         String formdata="";
55         if (data>=1024*1024) {//大於等於1M
56             formdata=Double.toString(data/1024/1024)+"M";
57         }else if(data>=1024){//大於等於1KB
58             formdata=Double.toString(data/1024)+"KB";
59         }else{//小於1KB
60             formdata=Double.toString(data)+"byte";
61         }
62         return formdata.substring(0, formdata.indexOf(".")+2);
63     }
64 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM