Vue 中批量下載文件并打包的示例代碼
思路: 用 ajax 將文件下載, 然后用 jszip 壓縮文件, 最后用 file-saver 生成文件
1. 準備工作
安裝 3 個依賴: axios, jszip, file-saver
yarn add axios yarn add jszip yarn add file-saver
2. 下載文件
import axios from 'axios'
const getFile = url => {
return new Promise((resolve, reject) => {
axios({
method:'get',
url,
responseType: 'arraybuffer'
}).then(data => {
resolve(data.data)
}).catch(error => {
reject(error.toString())
})
})
}
這里需要注意的是responseType, 如果下載文件是文本類型的(如: .txt, .js之類的), 那么用responseType: 'text'也可以, 但是如果下載的文件是圖片, 視頻之類的, 就得用arraybuffer
3. 打包文件
import JSZip from 'jszip'
import FileSaver from 'file-saver'
export default {
methods: {
handleBatchDownload() {
const data = ['各類地址1', '各類地址2'] // 需要下載打包的路徑, 可以是本地相對路徑, 也可以是跨域的全路徑
const zip = new JSZip()
const cache = {}
const promises = []
data.forEach(item => {
const promise = getFile(item).then(data => { // 下載文件, 并存成ArrayBuffer對象
const arr_name = item.split("/")
const file_name = arr_name[arr_name.length - 1] // 獲取文件名
zip.file(file_name, data, { binary: true }) // 逐個添加文件
cache[file_name] = data
})
promises.push(promise)
})
Promise.all(promises).then(() => {
zip.generateAsync({type:"blob"}).then(content => { // 生成二進制流
FileSaver.saveAs(content, "打包下載.zip") // 利用file-saver保存文件
})
})
},
},
}
4. 最終代碼
import axios from 'axios'
import JSZip from 'jszip'
import FileSaver from 'file-saver'
const getFile = url => {
return new Promise((resolve, reject) => {
axios({
method:'get',
url,
responseType: 'arraybuffer'
}).then(data => {
resolve(data.data)
}).catch(error => {
reject(error.toString())
})
})
}
export default {
render(h) {
return (<a on-click={ () => this.handleBatchDownload() } href="javascript:;" rel="external nofollow" >批量下載</a>)
},
methods: {
handleBatchDownload() {
const data = ['各類地址1', '各類地址2'] // 需要下載打包的路徑, 可以是本地相對路徑, 也可以是跨域的全路徑
const zip = new JSZip()
const cache = {}
const promises = []
data.forEach(item => {
const promise = getFile(item).then(data => { // 下載文件, 并存成ArrayBuffer對象
const arr_name = item.split("/")
const file_name = arr_name[arr_name.length - 1] // 獲取文件名
zip.file(file_name, data, { binary: true }) // 逐個添加文件
cache[file_name] = data
})
promises.push(promise)
})
Promise.all(promises).then(() => {
zip.generateAsync({type:"blob"}).then(content => { // 生成二進制流
FileSaver.saveAs(content, "打包下載.zip") // 利用file-saver保存文件
})
})
},
},
}
注意:
如果下載的文件過大, 打包的時間將會很長, 甚至可能會導致瀏覽器奔潰
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決removeEventListener 無法清除監(jiān)聽的問題
這篇文章主要介紹了解決removeEventListener 無法清除監(jiān)聽的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Vue計算屬性computed與方法methods的區(qū)別及說明
這篇文章主要介紹了Vue計算屬性computed與方法methods的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
vue實現(xiàn)導出word文檔功能實例(含多張圖片)
項目需要導出word,于是乎又是查閱資料,然后自己寫,下面這篇文章主要給大家介紹了關(guān)于vue實現(xiàn)導出word文檔功能(含多張圖片)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-09-09

