Vue.js實(shí)現(xiàn)下載時(shí)暫停恢復(fù)下載
在 Vue 中實(shí)現(xiàn)下載時(shí)暫停和恢復(fù)功能,通??梢越柚?nbsp;XMLHttpRequest
對(duì)象來(lái)控制下載過(guò)程。XMLHttpRequest
允許在下載過(guò)程中暫停和繼續(xù)請(qǐng)求。
實(shí)現(xiàn)步驟
- 創(chuàng)建 Vue 組件:創(chuàng)建一個(gè) Vue 組件,包含下載、暫停和恢復(fù)按鈕。
- 初始化
XMLHttpRequest
對(duì)象:在組件中初始化一個(gè)XMLHttpRequest
對(duì)象,用于處理下載請(qǐng)求。 - 實(shí)現(xiàn)下載功能:通過(guò)
XMLHttpRequest
發(fā)起下載請(qǐng)求,并監(jiān)聽(tīng)下載進(jìn)度。 - 實(shí)現(xiàn)暫停功能:暫停
XMLHttpRequest
請(qǐng)求。 - 實(shí)現(xiàn)恢復(fù)功能:恢復(fù)
XMLHttpRequest
請(qǐng)求。
詳細(xì)代碼
<template> <div> <!-- 下載按鈕,點(diǎn)擊觸發(fā) downloadFile 方法 --> <button @click="downloadFile">下載</button> <!-- 暫停按鈕,點(diǎn)擊觸發(fā) pauseDownload 方法 --> <button @click="pauseDownload" :disabled="!isDownloading || isPaused">暫停</button> <!-- 恢復(fù)按鈕,點(diǎn)擊觸發(fā) resumeDownload 方法 --> <button @click="resumeDownload" :disabled="!isPaused">恢復(fù)</button> <!-- 顯示下載進(jìn)度 --> <p>下載進(jìn)度: {{ progress }}%</p> </div> </template> <script> export default { data() { return { xhr: null, // 存儲(chǔ) XMLHttpRequest 對(duì)象 isDownloading: false, // 標(biāo)記是否正在下載 isPaused: false, // 標(biāo)記是否暫停下載 progress: 0, // 下載進(jìn)度百分比 url: 'https://example.com/file.zip', // 下載文件的 URL,需要替換為實(shí)際的文件 URL resumeOffset: 0 // 恢復(fù)下載時(shí)的偏移量 }; }, methods: { downloadFile() { // 創(chuàng)建一個(gè)新的 XMLHttpRequest 對(duì)象 this.xhr = new XMLHttpRequest(); // 打開(kāi)一個(gè) GET 請(qǐng)求,設(shè)置響應(yīng)類(lèi)型為 blob this.xhr.open('GET', this.url, true); this.xhr.responseType = 'blob'; // 如果有恢復(fù)偏移量,設(shè)置請(qǐng)求頭的 Range if (this.resumeOffset > 0) { this.xhr.setRequestHeader('Range', `bytes=${this.resumeOffset}-`); } // 監(jiān)聽(tīng)下載進(jìn)度事件 this.xhr.addEventListener('progress', (event) => { if (event.lengthComputable) { // 計(jì)算下載進(jìn)度百分比 this.progress = Math.round((this.resumeOffset + event.loaded) / (this.resumeOffset + event.total) * 100); } }); // 監(jiān)聽(tīng)請(qǐng)求完成事件 this.xhr.addEventListener('load', () => { this.isDownloading = false; this.isPaused = false; this.resumeOffset = 0; // 創(chuàng)建一個(gè)臨時(shí)的 URL 對(duì)象 const url = window.URL.createObjectURL(this.xhr.response); // 創(chuàng)建一個(gè) <a> 元素 const a = document.createElement('a'); a.href = url; a.download = 'file.zip'; // 設(shè)置下載文件名 // 模擬點(diǎn)擊 <a> 元素進(jìn)行下載 a.click(); // 釋放臨時(shí) URL 對(duì)象 window.URL.revokeObjectURL(url); }); // 監(jiān)聽(tīng)請(qǐng)求錯(cuò)誤事件 this.xhr.addEventListener('error', () => { this.isDownloading = false; this.isPaused = false; console.error('下載出錯(cuò)'); }); // 開(kāi)始發(fā)送請(qǐng)求 this.xhr.send(); this.isDownloading = true; this.isPaused = false; }, pauseDownload() { if (this.isDownloading &&!this.isPaused) { // 暫停下載,終止 XMLHttpRequest 請(qǐng)求 this.xhr.abort(); this.isPaused = true; // 記錄當(dāng)前下載的偏移量 this.resumeOffset += this.xhr.response.byteLength || 0; } }, resumeDownload() { if (this.isPaused) { // 恢復(fù)下載,調(diào)用 downloadFile 方法 this.downloadFile(); } } } }; </script>
代碼注釋
代碼中的注釋已經(jīng)詳細(xì)解釋了每一步的作用,以下是一些關(guān)鍵部分的總結(jié):
downloadFile
方法:創(chuàng)建XMLHttpRequest
對(duì)象,發(fā)起下載請(qǐng)求,監(jiān)聽(tīng)下載進(jìn)度和完成事件,處理下載完成后的文件保存。pauseDownload
方法:暫停下載,終止XMLHttpRequest
請(qǐng)求,并記錄當(dāng)前下載的偏移量。resumeDownload
方法:恢復(fù)下載,調(diào)用downloadFile
方法,并設(shè)置請(qǐng)求頭的Range
以從指定位置繼續(xù)下載。
使用說(shuō)明
- 替換文件 URL:將
data
中的url
屬性替換為實(shí)際要下載的文件的 URL。 - 引入組件:將上述代碼保存為一個(gè) Vue 組件(例如
DownloadComponent.vue
),然后在需要使用的地方引入該組件。
<template> <div> <DownloadComponent /> </div> </template> <script> import DownloadComponent from './DownloadComponent.vue'; export default { components: { DownloadComponent } }; </script>
- 運(yùn)行項(xiàng)目:在瀏覽器中運(yùn)行 Vue 項(xiàng)目,點(diǎn)擊“下載”按鈕開(kāi)始下載文件,點(diǎn)擊“暫停”按鈕暫停下載,點(diǎn)擊“恢復(fù)”按鈕繼續(xù)下載。
到此這篇關(guān)于Vue.js實(shí)現(xiàn)下載時(shí)暫?;謴?fù)下載的文章就介紹到這了,更多相關(guān)Vue.js 下載時(shí)暫?;謴?fù)下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3組件的v-model:value與v-model的區(qū)別解析
在Vue3中,v-model和v-model:value都是用于實(shí)現(xiàn)雙向數(shù)據(jù)綁定的語(yǔ)法糖,但v-model:value提供了更顯式和靈活的綁定方式,允許你明確指定綁定的屬性名和事件名,它們的主要區(qū)別在于默認(rèn)行為、靈活性、多模型綁定和使用場(chǎng)景,感興趣的朋友一起看看吧2025-02-02記錄vue項(xiàng)目中遇到的一點(diǎn)小問(wèn)題
本文是腳本之家小編給大家收藏整理的關(guān)于vue項(xiàng)目中遇到的一點(diǎn)小問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05關(guān)于Echarts餅圖圖例太長(zhǎng)的解決方案
這篇文章主要介紹了關(guān)于Echarts餅圖圖例太長(zhǎng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02vue實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12vue項(xiàng)目接口管理,所有接口都在apis文件夾中統(tǒng)一管理操作
這篇文章主要介紹了vue項(xiàng)目接口管理,所有接口都在apis文件夾中統(tǒng)一管理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08vue 動(dòng)態(tài)組件(component :is) 和 dom元素限制(is)用法說(shuō)明
這篇文章主要介紹了vue 動(dòng)態(tài)組件(component :is) 和 dom元素限制(is)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09