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


Posted in Javascript onNovember 20, 2017

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

注意:

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

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

Javascript 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
jquery加载页面的方法(页面加载完成就执行)
Jun 21 Javascript
关于js里的this关键字的理解
Aug 17 Javascript
jquery+css3问卷答题卡翻页动画效果示例
Oct 26 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
Apr 28 Javascript
JS检测是否可以访问公网服务器功能代码
Jun 19 Javascript
浅谈node.js 命令行工具(cli)
May 10 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
Feb 02 Javascript
Vue解析剪切板图片并实现发送功能
Feb 04 Javascript
详解react组件通讯方式(多种)
May 06 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
Aug 06 Javascript
jQuery实现电梯导航模块
Dec 22 jQuery
VueJs 搭建Axios接口请求工具
Nov 20 #Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 #Javascript
详解vue+css3做交互特效的方法
Nov 20 #Javascript
解读ES6中class关键字
Nov 20 #Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 #Javascript
Node.js 中使用 async 函数的方法
Nov 20 #Javascript
利用three.js画一个3D立体的正方体示例代码
Nov 19 #Javascript
You might like
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
javascript String 对象
2008/04/25 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
Python备份Mysql脚本
2008/08/11 Python
Python数据类型详解(二)列表
2016/05/08 Python
简单实现python聊天程序
2018/04/01 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
django框架forms组件用法实例详解
2019/12/10 Python
详解python tkinter模块安装过程
2020/01/06 Python
北京大学自荐信范文
2014/01/28 职场文书
推广普通话演讲稿
2014/05/23 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
合同补充协议书
2016/03/24 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏