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 相关文章推荐
JavaScript delete操作符应用实例
Jan 13 Javascript
ModelDialog JavaScript模态对话框类代码
Apr 17 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Sep 13 Javascript
js编写trim()函数及正则表达式的运用
Oct 24 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
Dec 14 Javascript
30个经典的jQuery代码开发技巧
Dec 15 Javascript
JavaScript中数组继承的简单示例
Jul 29 Javascript
jQuery实现每隔几条元素增加1条线的方法
Jun 27 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
May 12 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 Javascript
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 开发环境配置(Zend Server安装)
2010/04/28 PHP
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
python统计cpu利用率的方法
2015/06/02 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
用python实现名片管理系统
2020/06/18 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
采购员的工作职责
2013/12/26 职场文书
中学生英语演讲稿
2014/04/26 职场文书
2014年后勤工作总结
2014/11/18 职场文书
2019垃圾分类宣传口号汇总
2019/08/16 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
Javascript之datagrid查询详解
2021/09/15 Javascript
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python