ajax上传文件带进度条的思路

  首先,需要2个重要的数据,total(文件总大小)和loaded(已经上传的大小),用 loaded/total,然后不断的更新进度条即可;

问:怎么拿到这两个重要数据呢?

答:在html5中有一个上传过程事件onprogress,在这个事件中可以读到这两个数据loaded和total;上传的时候不断的触发这个函数,然后更新进度条即可;

1         xhr.upload.onprogress = function(ev){
2             if(ev.lengthComputable){
3                 //有可能文件时分块上传,单块的文件时不能读到大小的
4                 var percent = 100*ev.loaded/ev.total;
5                 document.getElementById('bar').style.width = percent + '%';
6             }
7         }

全部代码

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3  <head>
 4   <title> new document </title>
 5   <meta name="generator" content="editplus" />
 6   <meta name="author" content="" />
 7   <meta name="keywords" content="" />
 8   <meta name="description" content="" />
 9   <script type="text/javascript">
10     function selfile(){
11         //创建formdata对象
12         var fd = new FormData();
13         //获取文件对象
14         var pic = document.getElementsByTagName('input')[0].files[0];
15         //追加到formdata里
16         fd.append('pic',pic);
17             var xhr = new XMLHttpRequest();
18         xhr.open('POST','04-upfile.php',true);
19         xhr.onreadystatechange = function(){
20             if(this.readyState == 4){
21                 document.getElementById('debug').innerHTML = this.responseText;
22             }
23         }
24 
25         //利用XHR2新标准,写监听函数
26         xhr.upload.onprogress = function(ev){
27             if(ev.lengthComputable){
28                 //有可能文件时分块上传,单块的文件时不能读到大小的
29                 var percent = 100*ev.loaded/ev.total;
30                 document.getElementById('bar').style.width = percent + '%';
31             }
32         }
33         xhr.send(fd);
34         
35     }
36   </script>
37   <style type="text/css">
38     #progress{
39     width:500px;
40     height:30px;
41     border:1px solid green;
42 
43     #bar{
44     width:8%;
45     height:100%;
46     border:1px solid blue;
47     }
48     }
49   </style>
50  </head>
51 
52  <body>
53 <div id="progress" >
54     <div id="bar" >
55         
56     </div>
57 </div>
58   <input type="file" name = "pic"  onchange="selfile();"/>
59 
60 <div id="debug" >
61     
62 </div>
63  </body>
64 </html>
原文地址:https://www.cnblogs.com/a2762/p/4106189.html