Vue 中实现批量下载文件并打包压缩的方法
本文介绍在 Vue 项目中实现批量文件下载并打包为 ZIP 的方法。通过 axios 获取文件二进制数据,利用 jszip 进行压缩,最后使用 file-saver 触发浏览器保存。需注意 responseType 设置及大文件可能导致浏览器崩溃的风险。
Vue 批量下载与打包实现思路
实现思路主要包含三个步骤:首先通过 ajax 请求获取文件数据,接着使用 jszip 库将获取到的文件进行压缩处理,最后借助 file-saver 库生成并保存最终的压缩包文件。
1. 准备工作
需要安装三个核心依赖库: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())
})
})
}
在此步骤中,需特别注意 axios 请求配置中的 responseType 属性。若下载的是文本类文件(如 .txt、.js 等),设置 responseType 为 'text' 即可;但若涉及图片或视频等非文本文件,则必须将 responseType 设置为 '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保存文件
})
})
},
},
}
性能注意事项
注意:
若待下载的文件体积过大,打包压缩过程将消耗大量时间,严重时甚至可能导致浏览器无响应或崩溃。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
怎么在React或Vue前端中使用Cube.js Client获取数据
2026-11-03 09:24:09
Vue.js 新手入门:怎么使用 Vite 快速搭建第一个项目
2026-11-02 10:30:55
Vue 项目中封装 heatmap.js:生命周期管理与内存释放
2026-11-02 09:17:40
uni-app 自定义组件开发与通信机制详解
2026-11-01 02:03:46
Vue.js 项目中 Mock 数据的三种实现方案
2026-10-31 17:23:18








