欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue 中批量下载文件并打包的示例代码

程序员文章站 2022-03-20 21:33:36
思路: 用 ajax 将文件下载, 然后用 jszip 压缩文件, 最后用 file-saver 生成文件 1. 准备工作 安装 3 个依赖: axios, jszip...

思路: 用 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保存文件
  })
  })
 },
 },
}

注意:

如果下载的文件过大, 打包的时间将会很长, 甚至可能会导致浏览器奔溃

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