ajax之上傳檔案顯示實時上傳進度、速度
阿新 • • 發佈:2020-12-23
利用FormData來實現檔案上傳及進度監控
- FormData中的upload 事件
- onloadstart 上傳開始
- onprogress 資料傳輸進行中
- evt.total :需要傳輸的總大小;
- evt.loaded :當前上傳的檔案大小;
- onabort 上傳操作終止
- onerror 上傳失敗
- onload 上傳成功
- onloadend 上傳完成(不論成功與否)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" >
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="file" class="myfile">
進度:<progress value="0" max="100"></progress ><span class="percent">0%</span>
速度:<span class="speed">0b/s</span>
<button>點選上傳</button>
<button>取消上傳</button>
</body>
<script>
let xhr = new XMLHttpRequest();
let btns = document.querySelectorAll("button" );
let stime; //開始上傳時間
let sloaded; //檔案大小
btns[0].onclick = function(){
let file = document.querySelector(".myfile").files[0];
let form = new FormData();
form.append("myfile",file);
xhr.open("post","/fileUpload",true);
xhr.onload = function(){
console.log(xhr.responseText);
}
xhr.upload.onloadstart = function(){
console.log("開始上傳");
stime = new Date().getTime();
sloaded = 0;
}
xhr.upload.onprogress = function(evt){
// console.log("正在上傳");
// console.log(evt);
// 上傳進度處理
// 當前檔案上傳的大小 evt.loaded
let percent = (evt.loaded/evt.total*100).toFixed(0);
// console.log(percent);
document.querySelector("progress").value = percent;
document.querySelector(".percent").innerHTML = percent + "%";
// 上傳速度處理
let endTime = new Date().getTime();
// 時間差 由於時間差是毫秒 故要除以1000
let dTime = (endTime - stime)/1000;
// 當前時間內上傳的檔案大小
let dloaded = evt.loaded - sloaded;
let speed = dloaded/dTime;
let unit = "b/s";
stime = new Date().getTime();
sloaded = evt.loaded;
if(speed/1024>1){
unit = "kb/s";
speed = speed/1024;
}
if(speed/1024>1){
unit = "mb/s";
speed = speed/1024;
}
// console.log(speed.toFixed(2));
document.querySelector(".speed").innerHTML = speed.toFixed(2) + unit;
}
xhr.upload.onload = function(){
console.log("上傳成功");
}
xhr.upload.onloadend = function(){
console.log("上傳完成");
}
xhr.upload.onabort = function(){
console.log("取消上傳");
}
xhr.send(form);
}
btns[1].onclick = function(){
xhr.abort();
}
</script>
</html>