1. 程式人生 > >原生js上傳圖片利用XHR的ProgressEvent物件diy進度條

原生js上傳圖片利用XHR的ProgressEvent物件diy進度條

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type='text/css'>
      #progress{
         width:400px;
         height:20px;
         border:solid 1px black;
      }
      #bar{
         background:#CAFFFF;
         width:50%;
         height:19px;
      }

    </style>
    <script type="text/javascript">
     function createXHR(){
        var xhr=null;
       if(window.XMLHttpRequest)  //要是支援XMLHttpRequest的則採用XMLHttpRequest生成物件
          xhr=new XMLHttpRequest();
       else if(window.ActiveXobiect)//要是支援win的ActiveXobiect則採用ActiveXobiect生成物件。
         xhr=new ActiveXobiect('Microsoft.XMLHTTP');
        return xhr;
     }
     function ajax_upload(){
       var xhr = createXHR();
       var formData=new FormData();
       var file = document.getElementsByTagName('input')[0].files[0];
       var info = '檔名:'+file.name+' 檔案型別:'+file.type+' 檔案大小:'+file.size;
       var showInfo=document.getElementById('showinfo');
       var bar=document.getElementById('bar');
       var progress=document.getElementById('progress');
       showInfo.innerHTML= info;
       formData.append('pic', file);
       var schedule = 0;
        //xhr.upload.onprogress是回撥函式,接收引數d是ProgressEvent物件,d.loaded表示已經上傳的,d.total表示檔案總大小。
       xhr.upload.onprogress=function(d){
           progress.style.display='block';
           schedule = d.loaded/d.total*100;
           schedule = schedule.toFixed(2);
           console.log(d);
           bar.style.width = schedule+'%';
           bar.innerHTML = schedule+'%';
       }
       xhr.open('POST', 'http://127.0.0.1/php/move_file.php', true);
       xhr.send(formData);
       xhr.onreadystatechange = function(){
         if( this.readyState == 4 && this.status == 200){
            showInfo.innerHTML = showInfo.innerHTML+'<br />'+this.responseText;
            progress.style.display = 'none';
         }
       }
     }
    </script>
</head>
<body>
    <input type='file' name='pic' />
    <input type='submit' value='提交' onclick='ajax_upload();'/>
    <div id='showinfo'></div>
    <br />
    <div id='progress' style='display:none;text-align:center;'>
       <div id='bar' style='text-align:right;'></div>
    </div>
</body>
</html>

PHP檔案:

<?php  
header("Access-Control-Allow-Origin:*");
header('Content-Type:text/html;charset=utf-8');
if(empty($_FILES))die('上傳為空檔案');  
if($_FILES['pic']['error']!=0)die('檔案上傳出錯');  
/* 
  需要注意的是,一般我們在測試開發時是在,window系統上的繼承環境上的,而window上是gbk2312編碼 
  要想儲存的檔名也是中文的話,要從utf-8轉為gbk2312,linux系統則不用,因為linux系統是utf-8編碼 
*/  
$content = iconv( "utf-8","gb2312", $_FILES['pic']['name']);  
move_uploaded_file($_FILES['pic']['tmp_name'],'./'.$content);  
echo '檔案上傳成功!';  
?>  

progress事件會在瀏覽器接收新資料期間週期性地觸發。而onprogress事件處理程式會接收到一個event物件,其target屬性是XHR物件,但包含著三個額外的屬性:lengthComputable、loaded和total。其中,lengthComputable是一個表示進度資訊是否可用的布林值,loaded表示已經接收的位元組數,total表示根據Content-Length響應頭部確定的預期位元組數.

為確保正常執行,必須在呼叫open()方法之前新增onprogress事件處理程式。在前面的例子中,每次觸發progress事件,都會以新的狀態資訊更新HTML元素的內容。當然也可以配合H5的標籤<progress value="5" max="10">來實現進度條。