1. 程式人生 > >http上傳檔案和進度監控以及構造multipart/form-data請求

http上傳檔案和進度監控以及構造multipart/form-data請求

http上傳檔案

html程式碼

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>http</title>
    <link rel="stylesheet" href="">
    <script src="js/common.js"></script>
    <script
src="js/http.js">
</script> </head> <body> <form action="upload" method="post" accept-charset="utf-8"> <input type="file" data-uploadTo="http://www.baidu.com"></input> </form> </body> </html>

js程式碼


//自用工具庫
var whenReady = (function(){
    var ready = false
; var funcs = [];//儲存函式的陣列 function handler(e){ if(ready) return; if(e.type === 'readystatechange' && document.readyState !== 'commplete'){ return; } for(var i=0;i<funcs.length;i++){ funcs[i].call(document); } //進行標記
ready = true; funcs = null;//置空 } if(document.addEventListener){ document.addEventListener('DOMContentLoaded', handler,false); document.addEventListener('readystatechange', handler,false); window.addEventListener('load',handler,false); }else{ //相容IE等不支援addEventListener方法的瀏覽器 document.attachEvent('onreadystatechange',handler); window.attachEvent('onload',handler); } return function isReady(f){ if(ready){ f.call(document); }else{ funcs.push(f); } } }()); whenReady(function(){ var elts = document.getElementsByTagName('input'); for (var i = 0; i < elts.length; i++) { var input=elts[i]; if(input.type !=='file') continue; var url = input.getAttribute('data-uploadTo'); if(!url) continue; input.addEventListener('change', function(){ var file = this.files[0]; if(!file) return; var xhr = new XMLHttpRequest(); xhr.open('POST',url); xhr.send(file); },false); } //postFormData('http://www.baidu.com'); checkBrowserIsSupportProgressEvent();//檢測當前瀏覽器對http progress事件的支援情況! });

構造multipart/form-data請求

//使用POST方法傳送multipart/form-data請求主題
function postFormData(url,data,callback){
  if(typeof FormData === 'undefined') throw new Error('FormData is not implemented!');
  var request = new XMLHttpRequest();
  request.open('POST',url);
  request.onreadystatechange = function(){
     if(request.readyState === 4 && callback){
           return callback(request);
     }
  }
  var formdata = new FormData();
  for(name in formdata){
    if(!formdata.hasOwnProperty(name)) continue;
    if(typeof formdata[name] ==='function') continue;
    formdata.append(name,formdata[name]);
  }
  //在mutipart請求主體中傳送名/值對 每隊都是請求的一部分 注意當傳入FormData 物件時 send()會自動設定Content-Type
  request.send(formdata);
}

http進度事件

並不是所有的瀏覽器都支援progress事件

//HTTP的進度事件
function checkBrowserIsSupportProgressEvent(){
  if('onprogress' in (new XMLHttpRequest())){
    alert('支援http進度事件!');
  }else{
    alert('對不起您的瀏覽器不支援http進度事件!請更換谷歌或者火狐瀏覽器!');
  }
}
request.onprogress=function(e){
  if(e.lengthComputable){
    progress.innerHTML = Math.round(100*e.loaded/e.total)+" % complete!";
  }
}