JavaScript上傳文件(進度條展示)

這個是上傳中途的截圖


代碼部分

    <template>
    <div class="flex">
        <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"
        @click = "UpladFile()"
        value  = "上傳"
        />
        <input
        type   = "button"
        @click = "cancleUploadFile()"
        value  = "取消"
        />
    </div>
    </template>

    <script>
    export default {
    name: "flex",
    data() {
        return {
        xhr    : "",
        ot     : "",
        oloaded: ""
        };
    },
    mounted() {},
    methods: {
        //上傳文件方法
        UpladFile() {
        let _this   = this;
        let fileObj = document.getElementById("file").files[0];  // js 獲取文件對象
        let url     = "";                                     // 接收上傳文件的后臺地址
        let form    = new FormData();                            // FormData 對象
        form.append("file", fileObj); // 文件對象
        _this.xhr = new XMLHttpRequest();  // XMLHttpRequest 對象
        _this.xhr.open("post", url, true); //post方式,url為服務(wù)器請求地址,true 該參數(shù)規(guī)定請求是否異步處理。
        _this.xhr.onload             = _this.uploadComplete;    //請求完成
        _this.xhr.onerror            = _this.uploadFailed;      //請求失敗
        _this.xhr.upload.onprogress  = _this.progressFunction;  //【上傳進度調(diào)用方法實現(xiàn)】
        _this.xhr.upload.onloadstart = function() {
            //上傳開始執(zhí)行方法
            _this.ot      = new Date().getTime();  //設(shè)置上傳開始時間
            _this.oloaded = 0;                     //設(shè)置上傳開始時,以上傳的文件大小為0
        };
        _this.xhr.send(form); //開始上傳,發(fā)送form數(shù)據(jù)
        },
        //上傳成功響應(yīng)
        uploadComplete(evt) {
        //服務(wù)斷接收完文件返回的結(jié)果
        let data = evt.target.responseText;
        if (data.success) {
            alert("上傳成功!");
        } else {
            alert("上傳失??!");
        }
        },
        //上傳失敗
        uploadFailed(evt) {
        alert("上傳失??!");
        },
        //取消上傳
        cancleUploadFile() {
        let _this = this;
        _this.xhr.abort();
        },
        //上傳進度實現(xiàn)方法,上傳過程中會頻繁調(diào)用該方法
        progressFunction(evt) {
        let _this         = this;
        let progressBar   = document.getElementById("progressBar");
        let percentageDiv = document.getElementById("percentage");
        // event.total是需要傳輸?shù)目傋止?jié),event.loaded是已經(jīng)傳輸?shù)淖止?jié)。如果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) + "%";
        }
        let time         = document.getElementById("time");
        let nt           = new Date().getTime();             //獲取當(dāng)前時間
        let pertime      = (nt - _this.ot) / 1000;           //計算出上次調(diào)用該方法時到現(xiàn)在的時間差,單位為s
            _this.ot     = new Date().getTime();             //重新賦值時間,用于下次計算
        let perload      = evt.loaded - this.oloaded;        //計算該分段上傳的文件大小,單位b
            this.oloaded = evt.loaded;                       //重新賦值已上傳文件大小,用以下次計算
        //上傳速度計算
        let speed  = perload / pertime;  //單位b/s
        let bspeed = speed;
        let 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);
        //剩余時間
        let resttime       = ((evt.total - evt.loaded) / bspeed).toFixed(1);
            time.innerHTML = 
            ",速度:" + speed + units + ",剩余時間:" + resttime + "s";
        if (bspeed == 0) time.innerHTML = "上傳已取消";
        }
    }
    };
    </script>
    <style scoped>
    .flex {
    width           : 100%;
    height          : 500px;
    background-color: #fff;
    padding         : 20px;
    }
    </style>

找的資料,然后寫入這個vue項目,需要優(yōu)化的地方自行優(yōu)化

這里卿洋
愿喜??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基于Vue的一些資料 內(nèi)容 UI組件 開發(fā)框架 實用庫 服務(wù)端 輔助工具 應(yīng)用實例 Demo示例 element★...
    嘗了又嘗閱讀 1,275評論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,035評論 4 61
  • 加入007寫作群的第四周,這周的主題是這一個月來你的想法或者感悟的分享。 其實老實說,內(nèi)心的感慨很多很多,要不說寫...
    月兒琬琬的夢想30閱讀 1,078評論 7 6
  • 窮奇似虎,有翼,吃人從頭開始。 蜪(tao3)犬似犬,青身,吃人從頭開始。
    畫師昊淵閱讀 3,115評論 5 4
  • 工程建設(shè)--悍馬模板 公司又有新的業(yè)務(wù)了,竟然讓我們做悍馬汽車的模型--車模,這就有點難為人了,不過老板說“不用考...
    死磕自己閱讀 554評論 0 2

友情鏈接更多精彩內(nèi)容