利用js实现无刷新上传头像(或文件)并显示进度条

无刷新上传原理:现在我们利用新技术FormData表单数据对象可以实现快速收集表单信息,普通表单域 和 上传文件域 均可以收集,再结合ajax就可以实现无刷新上传。

那么怎样显示进度条呢?原来ajax对象有upload成员,该成员也是对象,构造器是XMLHttpRequestUpload,该upload对象本身有onprogress事件,每隔100ms就执行一次,同时会获取当前附件的上传情况,包括总大小,已上传大小信息。

利用js实现无刷新上传头像(或文件)并显示进度条


利用js实现无刷新上传头像(或文件)并显示进度条

下面直接贴代码:

(1)index.html

[html] view plain copy
  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>利用js的FormData对象快速收集表单信息及无刷新上传头像</title>  
  6.     <style>  
  7.         #pat{width:200px;height: 20px;  
  8.             border-radius: 5px;  
  9.             background-color: #ccc;  
  10.             margin: 10px}  
  11.         #son{width: 0;height: 100%;  
  12.             background: #9cf;  
  13.             text-align: center;  
  14.             border-radius: 5px}  
  15.     </style>  
  16. </head>  
  17. <body>  
  18. <form enctype="multipart/form-data">  
  19.     用户名:<input type="text" name="user"><br/>  
  20.     密码:<input type="password" name="pass"><br/>  
  21.     头像:<input type="file" name="file"><br/>  
  22.     <input type="submit" value="提交" name="sub">  
  23. </form>  
  24. <div id="showResult" style="display: none">  
  25. <p>ajax无刷新界面返回结果:</p>  
  26. 用户名:<input type="text" id="user" disabled="disabled"><br/>  
  27.   密码:<input type="text" id="pass" disabled="disabled"><br/>  
  28.   头像:<img src="" id="face" style="width:200px;height:200px">  
  29.         <div id="pat"><div id="son"></div></div>  
  30. </div>  
  31. <script type="text/javascript">  
  32.         var fm=document.getElementsByTagName('form')[0];  
  33.         fm.onsubmit=function () {  
  34.             //实例化 FormData对象,同时收集表单的信息,包括普通表单域和文件表单域的信息  
  35.             var fd=new FormData(fm);  
  36.             var xhr=new XMLHttpRequest();  
  37.             xhr.onreadystatechange=function () {  
  38.                 if(xhr.readyState==4){  
  39.                     eval("var info="+xhr.responseText); //将json信息转化成js对象  
  40.                     var result=document.getElementById("showResult"),  
  41.                         user=document.getElementById("user"),  
  42.                         pass=document.getElementById("pass"),  
  43.                         face=document.getElementById("face");  
  44.                     result.style.display='block';  
  45.                     user.value=info.user;  
  46.                     pass.value=info.pass;  
  47.                     face.setAttribute("src",info.face);  
  48.                 }  
  49.             };  
  50.             xhr.upload.onprogress=function (evt) {   //事件监听器,获取上传的情况  
  51.                 var loaded=evt.loaded,  //已上传的大小  
  52.                     total=evt.total,  //总大小  
  53.                     per=Math.floor((loaded/total)*100)+'%', //转换成百分比  
  54.                     son=document.getElementById("son");  
  55.                 son.innerHTML=per;  
  56.                 son.style.width=per;  
  57.             }  
  58.             xhr.open('post','./upload.php');    
  59.             xhr.send(fd);   //发送数据  
  60.             return false;   //阻止页面提交  
  61.         }  
  62. </script>  
  63. </body>  
  64. </html>  


(2)upload.php

[php] view plain copy
  1. <?php  
  2.   
  3. $user=$_POST['user'];  
  4. $pass=$_POST['pass'];  
  5. $file=$_FILES['file'];  
  6. foreach ($file as $key => $value) {  
  7.     $$key=$value;  
  8. }  
  9. $path='face/'.time().strtolower(strstr($name'.'));  //修改上传文件的名称,strstr($name, '.')是获取后缀名  
  10. move_uploaded_file($tmp_name,$path);  
  11. $path=strstr($path,$path[0]);  //图片的存储地址  
  12. $arr=array(  
  13.     "user"=>$user,  
  14.     "pass"=>$pass,  
  15.     "face"=>$path  
  16. );  
  17. $json=json_encode($arr);  //json编码  
  18. echo $json;  
  19. ?>  
我们还得在同级目录下创建一个face文件夹,来保存上传的文件。

点击提交前效果如下:

利用js实现无刷新上传头像(或文件)并显示进度条

当我点击提交,就会显示下面效果:

利用js实现无刷新上传头像(或文件)并显示进度条

怎么样?酷炫吧~~~


如果要无刷新上传多张图片,那该怎么做呢??

很简单,只要将这多张图片一张一张上传,最后返回这些图片的服务器最终存储地址就行啦!