摘要:當後臺返回一個檔案地址給前端,需要前端下載並重新命名,展示下載進度。
使用技術:ajax、blob、vue外掛file-saver
1、外掛
我們不做過多解釋,我們這裡只是使用,這是外掛教程地址:http://vuejscomponent.com/pac...
2、專案程式碼
import FileSaver from 'file-saver'
// URL:檔案存放地址,fileName:儲存檔名稱,downloadType:儲存檔案格式
const singleFileDownload = (url, fileName, downloadType) => {
return new Promise((resolve, reject) => {
if (!url || !fileName) {
reject('檔案不存在')
return
}
var xhr = new XMLHttpRequest()
xhr.open('GET', url, true)
xhr.responseType = 'blob'
// 當請求被髮送到伺服器時,我們需要執行一些基於響應的任務。
// 每當 readyState 改變時,就會觸發 onreadystatechange 事件。
// onreadystatechange儲存函式(或函式名),每當 readyState 屬性改變時,就會呼叫該函式。
// readyState
// 存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。
// 0: 請求未初始化
// 1: 伺服器連線已建立
// 2: 請求已接收
// 3: 請求處理中
// 4: 請求已完成,且響應已就緒
// 用true時,表示傳送非同步請求,請規定在響應處於 onreadystatechange 事件中的就緒狀態時執行的函式:
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200 || xhr.status === 0) {
let file = null
if (downloadType === 'pdf') {
file = new Blob([xhr.response], { type: "application/pdf" });
} else {
file = new Blob([xhr.response], { type: "application/zip" });
}
FileSaver.saveAs(file, fileName)
resolve('下載成功')
} else {
reject(new Error(fileName + '下載失敗'), null)
}
}
}
xhr.addEventListener('progress', (e) => {
// e.total就是檔案的總位元組 e.loaded就是檔案已載入了多少位元組了
// downloadFile.progress = (e.loaded * 1.0 / e.total * 100).toFixed(2) + '%'
// downloadFile.progress = (e.loaded / (1024 * 1024)).toFixed(2) + 'M/' + (e.total / (1024 * 1024)).toFixed(2) + 'M'
})
xhr.send()
})
}