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 相关文章推荐
jquery复选框CHECKBOX全选、反选
Aug 30 Javascript
JavaScript对象链式操作代码(jquery)
Jul 04 Javascript
JavaScript类和继承 prototype属性
Sep 03 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
Feb 06 Javascript
js 火狐下取本地路径实现思路
Apr 02 Javascript
如何防止回车(enter)键提交表单
May 11 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
Vue多系统切换实现方案
Jun 05 Javascript
JavaScript面向对象继承原理与实现方法分析
Aug 09 Javascript
React生命周期原理与用法踩坑笔记
Apr 28 Javascript
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
使用jquery实现轮播图效果
Jan 02 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的时间戳与具体时间转化的简单实现
2016/06/13 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
解除劳动合同协议书
2014/04/14 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
实施意见格式范本
2015/06/05 职场文书