代碼來源於 http://www.cnblogs.com/tianyuchen/p/5594641.htmljavascript
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XMLHttpRequest上傳文件進度實現</title>
<script type="text/javascript">
var xhr;
var ot;//
var oloaded;
//上傳文件方法
function UpladFile() {
var fileObj = document.getElementById("file").files[0]; // js 獲取文件對象
var url = "http://172.0.0.70/errorstore/upload/"; // 接收上傳文件的後臺地址
var form = new FormData(); // FormData 對象
form.append("mf", fileObj); // 文件對象
xhr = new XMLHttpRequest(); // XMLHttpRequest 對象
xhr.open("post", url, true); //post方式,url爲服務器請求地址,true 該參數規定請求是否異步處理。
xhr.onload = uploadComplete; //請求完成
xhr.onerror = uploadFailed; //請求失敗
xhr.upload.onprogress = progressFunction;//【上傳進度調用方法實現】
xhr.upload.onloadstart = function(){//上傳開始執行方法
ot = new Date().getTime(); //設置上傳開始時間
oloaded = 0;//設置上傳開始時,以上傳的文件大小爲0
};
xhr.send(form); //開始上傳,發送form數據
}
//上傳進度實現方法,上傳過程當中會頻繁調用該方法
function progressFunction(evt) {
var progressBar = document.getElementById("progressBar");
var percentageDiv = document.getElementById("percentage");
// event.total是須要傳輸的總字節,event.loaded是已經傳輸的字節。若是event.lengthComputable不爲真,則event.total等於0
if (evt.lengthComputable) {//
progressBar.max = evt.total;
progressBar.value = evt.loaded;
percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100) + "%";
}
var time = document.getElementById("time");
var nt = new Date().getTime();//獲取當前時間
var pertime = (nt-ot)/1000; //計算出上次調用該方法時到如今的時間差,單位爲s
ot = new Date().getTime(); //從新賦值時間,用於下次計算
var perload = evt.loaded - oloaded; //計算該分段上傳的文件大小,單位b
oloaded = evt.loaded;//從新賦值已上傳文件大小,用如下次計算
//上傳速度計算
var speed = perload/pertime;//單位b/s
var bspeed = speed;
var units = 'b/s';//單位名稱
if(speed/1024>1){
speed = speed/1024;
units = 'k/s';
}
if(speed/1024>1){
speed = speed/1024;
units = 'M/s';
}
speed = speed.toFixed(1);
//剩餘時間
var resttime = ((evt.total-evt.loaded)/bspeed).toFixed(1);
time.innerHTML = ',速度:'+speed+units+',剩餘時間:'+resttime+'s';
if(bspeed==0)
time.innerHTML = '上傳已取消';
}
//上傳成功響應
function uploadComplete(evt) {
//服務斷接收完文件返回的結果
// alert(evt.target.responseText);
alert("上傳成功!");
}
//上傳失敗
function uploadFailed(evt) {
alert("上傳失敗!");
}
//取消上傳
function cancleUploadFile(){
xhr.abort();
}
</script>
</head>
<body>
<progress id="progressBar" value="0" max="100" style="width: 300px;"></progress>
<span id="percentage"></span><span id="time"></span>
<br /><br />
<input type="file" id="file" name="myfile" />
<input type="button" onclick="UpladFile()" value="上傳" />
<input type="button" onclick="cancleUploadFile()" value="取消" />
</body>
</html>html