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 动态数据下的锚点错位问题解决方法
Dec 24 Javascript
node.js使用require()函数加载模块
Nov 26 Javascript
Javascript的闭包详解
Dec 26 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
Js为表单动态添加节点内容的方法
Feb 10 Javascript
JS实现点击上移下移LI行数据的方法
Aug 05 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 Javascript
浅谈vue方法内的方法使用this的问题
Sep 15 Javascript
基于jQuery实现挂号平台首页源码
Jan 06 jQuery
VUE实现自身整体组件销毁的示例代码
Jan 13 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中文汉字验证码
2007/04/08 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
javascript版2048小游戏
2015/03/18 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
js实现随机点名
2021/01/19 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
python爬虫请求头的使用
2020/12/01 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
《长城》教学反思
2014/02/14 职场文书
售后求职信范文
2014/03/15 职场文书
市场拓展计划书
2014/05/03 职场文书
终止合同协议书范本
2016/03/22 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书