Vue 中实现批量下载文件并打包压缩的方法

作者:南栀

时间:2026-10-22

浏览:180

本文介绍在 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保存文件
  })
  })
 },
 },
}

性能注意事项

注意:

若待下载的文件体积过大,打包压缩过程将消耗大量时间,严重时甚至可能导致浏览器无响应或崩溃。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章