在日常生活中,有時我們需要從網站下載文件,例如文檔、圖片、音頻、視頻等等。然而,傳統的下載方式需要用戶進入新頁面或彈窗進行下載,操作繁瑣並且影響用戶體驗。因此,在這篇文章中,我們將介紹如何使用Vue框架實現一種更加簡便、快捷的下載文件功能,提高用戶的瀏覽體驗。
一、使用axios實現文件下載
為了實現下載功能,我們需要使用到Vue框架中的網路請求庫axios,下載文件的過程在後端實現,前端只需發送請求即可。具體實現過程如下:
import axios from 'axios'
export const downloadFile = function(url, params) {
return new Promise((resolve, reject) => {
axios.post(url, params, {
responseType: 'blob'
})
.then(response => {
// 獲取後端返回的文件名
var fileName = response.headers['content-...
// 通過瀏覽器下載文件
var url = window.URL.createObjectURL(new Blob([res...))
var link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', fileName)
document.body.appendChild(link)
link.click()
resolve()
})
.catch(error => {
reject(error)
})
})
}
在代碼中,我們定義了一個名為downloadFile的函數,它接收兩個參數,url表示文件下載鏈接,params為下載參數,我們可以在params參數中配置一些可選項,例如請求頭、請求體等信息,這裡不再贅述。在函數內部,我們先發送一個post請求,並且設置響應數據類型為blob(二進位流),這樣返回的數據就可以直接用於下載文件了。後端需要設置Content-Disposition響應頭信息,告訴瀏覽器要下載文件。我們可以在響應頭中自定義文件名,然後通過Blob對象創建一個URL鏈接,將鏈接賦值給一個隱藏的標籤,並指定下載文件的文件名,最後調用click()方法觸發下載即可。如果需要非同步調用downloadFile函數,可以通過Promise進行封裝。
二、使用Vue組件方式封裝下載組件
既然下載文件是常見的需求,那麼我們可以將下載功能封裝為一個Vue組件,方便在項目中重複使用。我們來實現一個DownloadButton組件,它可以接收兩個屬性:URL和params,分別表示文件下載鏈接和請求參數。
<template>
<button @click="handleDownload">下載</button>
</template>
<script>
import axios from 'axios'
export default {
name: 'DownloadButton',
props: {
url: String,
params: Object
},
methods: {
handleDownload() {
axios.post(this.url, this.params, {
responseType: 'blob'
}).then(response => {
...
}).catch(error => {
console.log(error)
})
}
}
}
</script>
在代碼中,我們首先引入了axios庫,並在組件定義中聲明了name屬性以及props屬性,接著定義了一個名為handleDownload的函數,用於處理下載邏輯。當用戶點擊下載按鈕時,我們調用axios庫發送post請求,並將響應數據類型設置為blob(二進位流),在請求成功後,執行和上文一樣的下載邏輯即可。此時,我們已經將下載功能封裝成了一個完整的組件,可以在任意頁面使用只需傳入相應的URL和params參數即可。
三、使用Element UI提示下載進度
通常情況下,我們在下載文件時可能需要等待一段時間,這段時間可能很短,也可能很長,用戶無從得知。為了提高用戶體驗,我們可以使用Element UI框架提供的Progress組件,在下載文件時顯示下載進度,從而讓用戶感受到下載的進展。
<template>
<div>
<el-button type="primary" :loading="loading" @click="startDownload">下載文件</el-button>
<el-progress v-if="downloading" :percentage="downloadProgress" show-text strokeLinecap="square" />
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'DownloadProgress',
data() {
return {
loading: false,
downloading: false,
downloadProgress: 0,
downloadUrl: '',
downloadParams: {}
}
},
methods: {
startDownload() {
this.loading = true
axios.post(this.downloadUrl, this.downloadParams, {
responseType: 'blob',
onDownloadProgress: progressEvent => {
// 更新下載進度
this.downloadProgress = Math.floor(progressEvent.loaded / progressEvent.total * 100)
}
}).then(response => {
...
}).catch(error => {
console.log(error)
})
}
},
props: {
url: String,
params: Object
},
watch: {
url(val) {
this.downloadUrl = val
},
params(val) {
this.downloadParams = val
}
}
}
</script>
在代碼中,我們首先在組件定義中聲明了data屬性,包含了4個屬性:loading表示按鈕是否處於loading狀態,downloading表示是否正在下載文件,downloadProgress表示下載進度,downloadUrl和downloadParams分別表示文件下載鏈接和請求參數。在模板中,我們使用了Element UI的Button組件,綁定了一個startDownload方法,在方法內調用了axios庫發送post請求,並設置響應數據類型為blob(二進位流),同時指定了onDownloadProgress回調函數,在下載過程中可以將下載進度更新給downloadProgress屬性。在下載結束後,執行和上文一樣的下載邏輯即可。最後,我們在模板中使用了Element UI的Progress組件,根據downloadProgress動態展示下載進度。通過此種方式,我們可以實現一個帶有下載進度提示的下載組件。
原創文章,作者:TIZZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144633.html