效果


引入
<script src="https://cdn.bootcss.com/jquery/2.2.3/jquery.min.js"></script>
1、html
<div> <span>上傳文件:</span><input type="file" name="file" id="myFile" onchange="uploadTeamworkFile(this)"> <div class="show_info"> 文件信息:... </div> <div class="show_result"> 返回結果:... </div> </div> <div class="col-md-offset-3 col-md-6"> <div id="loadingpy" style="display:none;position:absolute;top:0;left:0;right:0;bottom:0;z-index:10000;background-color:rgba(0,0,0,0.5)"> <div class="progressContent"> <div class="progresscon"> <div class="progress"> <div class="progress-bar progress-bar-info progress-bar-striped active" id="mt-progress-length" style="width: 0%;"> <div class="progress-value" id="mt-progress-value">0%</div> </div> </div> </div> <div class="speedNumberShow"> <span>已上傳:</span><i>602M</i><span>總大小:</span><i>800M</i><span>速度:</span><i>203KB/S</i><span>剩余時間:</span><i>3分53秒</i><span>已用時間:</span><i>10分06秒</i> </div> </div> </div> </div>
2、js
<script>
var myXhr;
var myot; //上傳開始時間
var myoloaded; //上傳文件大小
function uploadTeamworkFile(obj) {
var file = obj.files[0];
var name = file.name;
var size = file.size;
var type = file.type;
url = window.URL.createObjectURL(file);
$(".show_info").html("文件名:" + name + "<br>文件類型:" + type + "<br>文件大小:" + size + "<br>url: " + url);
//創建formData對象 初始化為form表單中的數據
//需要添加其他數據 就可以使用 formData.append("property", "value");
var formData = new FormData();
var fileInput = document.getElementById("myFile");
var file = fileInput.files[0];
formData.append("file", file);
uploadInitProfn(); //初始化進度條樣式
// ajax異步上傳
$.ajax({
url: "http://localhost:1001/login/upload", //url 需后台提供
type: "POST",
data: formData,
contentType: false, //必須false才會自動加上正確的Content-Type
processData: false, //必須false才會避開jQuery對 formdata 的默認處理
enctype: 'multipart/form-data',
xhr: function () {
//獲取ajax中的ajaxSettings的xhr對象 為他的upload屬性綁定progress事件的處理函數
myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
myXhr.upload.addEventListener("progress", resultProgress, false); //【上傳進度調用方法實現】
//檢查其屬性upload是否存在
myXhr.upload.onloadstart = function(){//上傳開始執行方法
myot = new Date().getTime(); //設置上傳開始時間
myoloaded = 0;//設置上傳開始時,以上傳的文件大小為0
};
}
return myXhr;
},
success: function (data) {
console.log("aaa");
},
error: function (data) {
console.log("cccc");
}
})
}
//初始化進度條樣式
function uploadInitProfn(){
//背景恢復
$(".progress-bar-info").css("background-color","#5bc0de");
//歸零 隱藏
$("#mt-progress-length").css({"width": "0%"});
$("#mt-progress-value").html("0%");
$(".progressContent .progress-value").css({"background":"#5bc0de"});
$(".progress .progress-value").remove("change");
$(".progress-bar.active").css("animation","reverse progress-bar-stripes 0.40s linear infinite, animate-positive 0.1s");
$(".speedNumberShow").html(""); //清空提示信息
$("#loadingpy").show(); //進度條顯示
}
//上傳進度回調函數
function resultProgress(evt) {
if (evt.lengthComputable) {
var percent = evt.loaded / evt.total * 100;
var percentStr = String(percent);
if (percentStr == "100") {
percentStr = "100.0";
}
percentStr = percentStr.substring(0, percentStr.indexOf("."));
$("#mt-progress-value").html(percentStr+"%");
$("#mt-progress-length").css("width", percentStr + "%");
var mynt = new Date().getTime();//獲取當前時間
var pertime = (mynt-myot)/1000; //計算出上次調用該方法時到現在的時間差,單位為s
myot = new Date().getTime(); //重新賦值時間,用於下次計算
var perload = evt.loaded - myoloaded; //計算該分段上傳的文件大小,單位b
myoloaded = 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);
console.log(evt.total+"===="+evt.loaded+"===="+bspeed+"===="+resttime);
resttime = s_to_hs(resttime);
//已用時間
var usedtime = (evt.loaded/bspeed).toFixed(1);
usedtime = s_to_hs(usedtime);
var speedStr = '<span>已上傳:</span><i>'+evt.loaded+'M</i><span>總大小:</span><i>'+evt.total+'M</i><span>速度:</span><i>'+speed+units+'</i><span>剩余時間:</span><i>'+resttime+'</i><span>已用時間:</span><i>'+usedtime+'</i>'
$(".speedNumberShow").html(speedStr);
if (percentStr == "100") {
setTimeout(function () {
//動畫禁止,變顏色
$(".progress-bar-info").css("background-color","#41b680");
$(".progress-bar.active").css("animation","unset");
$(".progressContent .progress-value").css({"background":"#41b680"});
$(".progress .progress-value").addClass("change");
}, 500);
}
}
}
function s_to_hs(s){
//計算分鍾
//算法:將秒數除以60,然后下舍入,既得到分鍾數
var h;
h = Math.floor(s/60);
//計算秒
//算法:取得秒%60的余數,既得到秒數
s = s%60;
//將變量轉換為字符串
h += '';
s += '';
//如果只有一位數,前面增加一個0
h = (h.length==1)?'0'+h:h;
s = (s.length==1)?'0'+s:s;
if(s<=60){
return s+'秒';
}else {
return h+'分'+s+'秒';
}
}
</script>
3、css
<style type="text/css"> .demo { padding: 2em 0; background: linear-gradient(to right, #2c3b4e, #4a688a, #2c3b4e); } .progressContent{ margin-top: 16%; margin-left: 35%; } .progressContent .progress { height: 15px; background: #262626; padding: 2px; overflow: visible; border-radius: 20px; width: 100%; margin-bottom:0; } .progressContent .progresscon{ width:48%; margin-top: 5px; } .progress .progress-bar { border-radius: 20px; position: relative; animation: animate-positive 0.1s; } .progressContent .progress-value { display: block; padding: 3px 7px; font-size: 13px; color: #fff; border-radius: 4px; background: #5bc0de; position: absolute; top: -36px; right: -16px; } .progress .progress-value:after { content: ""; border-top: 10px solid #5bc0de; border-left: 10px solid transparent; border-right: 10px solid transparent; position: absolute; bottom: -6px; left: 26%; } .progress .progress-value.change:after{ border-top: 10px solid #41b680; } .progress-bar.active { animation: reverse progress-bar-stripes 0.40s linear infinite, animate-positive 0.1s; } .speedNumberShow{ color:#f2efef; margin-top: 3px; } .speedNumberShow span{ font-size:12px; } .speedNumberShow i{ font-style: normal; font-size:14px; margin-right: 11px; } @-webkit-keyframes animate-positive { 0% { width: 0; } } @keyframes animate-positive { 0% { width: 0; } } </style>
