本文主要介紹了Vue 中批量下載文件並打包的示例代碼,用ajax 將文件下載, 然後用jszip 壓縮文件, 最後用file-saver 生成文件,有興趣的可以了解一下,希望能幫助到大家。
想法: 用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中批次下載檔案並打包詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!