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对象模型-执行模型
Apr 28 Javascript
AJAX分页的代码(后台asp.net)
Feb 14 Javascript
Js 冒泡事件阻止实现代码
Jan 27 Javascript
一个js控制的导航菜单实例代码
Dec 03 Javascript
JavaScript中实现Map的示例代码
Sep 09 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
利用angular、react和vue实现相同的面试题组件
Feb 19 Javascript
详解jQuery设置内容和属性
Apr 11 jQuery
vue+Element实现搜索关键字高亮功能
May 28 Javascript
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
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 curl 获取响应的状态码的方法
2014/01/13 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
Python版中国省市经纬度
2020/02/11 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
中专三年学习的个人自我评价
2013/12/12 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
中标通知书范本
2015/04/17 职场文书
运动会通讯稿300字
2015/07/20 职场文书