http上傳檔案和進度監控以及構造multipart/form-data請求
阿新 • • 發佈:2019-01-06
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!";
}
}