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保存文件 }) }) }, }, }
注意:
如果下載的文件過大, 打包的時間將會很長, 甚至可能會導致瀏覽器奔潰
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Vue裝飾器中的vue-property-decorator?和?vux-class使用詳解
這篇文章主要介紹了Vue裝飾器中的vue-property-decorator?和?vux-class使用詳解,通過示例代碼給大家介紹的非常詳細,對vue-property-decorator?和?vux-class的使用感興趣的朋友一起看看吧2022-08-08typescript+vite項目配置別名的方法實現(xiàn)
我們?yōu)榱耸÷匀唛L的路徑,經常喜歡配置路徑別名,本文主要介紹了typescript+vite項目配置別名的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07如何使用electron將vue項目打包成.exe文件(保姆級教程)
本文給大家介紹如何使用electron將vue項目打包成.exe文件,大家要注意一下vue2項目,使用的vue-element-admin框架,用electron打包成.exe文件,本文結合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2024-03-03vue中的attribute和property的具體使用及區(qū)別
本文主要介紹了vue中的attribute和property的具體使用及區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09