在另一篇里已經說了如何實現type="file"的input文件上傳,現新增需求需要展示上傳的進度,所以在原來基礎上再加上
文件上傳-不帶進度條: https:////www.cnblogs.com/liangpi/p/12503533.html
先看效果展示:
1、首先還是先添加html
<!-- 上傳按鈕 --> <div class="fileBtn" id="uploadBtn"> <input type="file" id="uploadfile"> <button type="button" class="btn btn-primary btn-sm btn-flie">上傳附件</button> </div> <!-- 文件信息 --> <div class="info-item" id="fileList"> <!-- <div class="files-info"> <p>文件1.pdf</p> <p class="filedown checkIcon"><img src="images/check.png" alt=""></p> <p class="filedown downIcon"><img src="images/down.png" alt=""></p> <p class="filedown deleteIcon"><img src="images/del.png" alt=""></p> </div> --> </div> <!-- 進度條 --> <div class="progressBox" id="progressBox"> <div class="progressItem"> <div class="progressBar" id="progressBar"></div> <div class="progressText" id="progressText">0%</div> </div> </div>
2、css樣式
.fileBtn { position:relative; } .fileBtn #uploadfile { width: 120px; height: 30px; filter: Alpha(opacity=0); -moz-opacity:0; opacity: 0; position: absolute; z-index: 2; } .fileBtn .btn-flie { width: 120px; height: 30px; position: absolute; z-index: 1; } .info-item { margin-top: 30px; } .progressBox{ margin-top: 35px; width: 50%; height: 10px; background: #fff; display: block; } .progressBox .progressItem { width: 100%; height: 100%; border: 1px solid #ccc; border-radius: 5px; position: relative; } .progressBox .progressBar{ width: 0; height: 100%; background: #337ab7; border-radius: 5px; position: absolute; top: 0; left: 0; } .progressBox .progressText{ font-size: 14px; color: #337ab7; position: absolute; top: -7px; right: -50px; }
3、js相關代碼
var fileList = [] // 文件list $('#uploadfile').change(function(){ // 初始化進度條狀態 // $('#progressBox').css("display","block") $('#progressBar').css('width','0%'); $('#progressText').text('0%'); var fileItem = $('#uploadfile')[0].files[0] var formData = new FormData(); formData.append('file', fileItem) formData.append('type', '1') $.ajax ({ type : "post", url : "/user/upload", data : formData, async : true, cache : false, contentType : false,//需設置為false,因為是FormData對象,且已經聲明了屬性enctype="multipart/form-data" processData : false,//需設置為false,因為data值是FormData對象,不需要對數據做處理 dataType : 'json', xhr: function() { var xhr = $.ajaxSettings.xhr(); if (xhr.upload) { xhr.upload.addEventListener("progress", function (e) { var loaded = e.loaded; //已經上傳大小情況 var tot = e.total; //附件總大小 var per = Math.floor(100 * loaded / tot); //已經上傳的百分比 $('#progressBar').css('width',per+'%'); //這里指的是進度條的寬度等於完成的百分比 $('#progressText').text(per+'%'); //顯示進度百分比 }, false); return xhr; } }, success : function (data) { if (data.code == 2000){ var dataInfo = data.data if(dataInfo) { toastr.success('上傳成功'); // 提示上傳成功插件-可以更換與不用 // $('#progressBox').css("display","none") // 這句是上傳成功后將進度條隱藏,看自己需求是否需要 // 重置進度條 $('#progressBar').css('width','0%'); $('#progressText').text('0%'); setTimeout( function(){ toastr.clear(); }, 1000); fileList.push(dataInfo) showFile() } } else{ alert(data.message); } }, error : function(data) { toastr.error('上傳失敗'); // $('#progressBox').css("display","none") setTimeout( function(){ toastr.clear(); }, 1000); } }); }); function showFile() { // 展示文件信息 var fileItem = fileList if(fileItem.length){ var str = '' for(var i = 0; i < fileItem.length; i++){ str += '<div class="files-info"><div>'; str += fileItem[i].name str += '</div>' str += '<div class="iconGroup">' str += '<p class="filedown downLoad"><img src="images/down.png" alt="" onclick=downFileItem(' str += "\'"; str += fileItem[i].url; str += "\'"; str += ')></p>'; if(status!=1&&status!=3){ str += '<p class="filedown delete"><img src="images/del.png" alt="" onclick=delFileItem(' str += "\'"; str += i; str += "\'"; str += ')></p>'; } str += '</div>'; str += '</div>'; } $('#fileList').html(str) } else { $('#fileList').empty() } };