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 相关文章推荐
让回调函数 showResponse 也带上参数的代码
Aug 13 Javascript
for 循环性能比较 提高for循环的效率
Mar 19 Javascript
jQuery Dialog 弹出层对话框插件
Aug 09 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
浅谈webpack下的AOP式无侵入注入
Nov 12 Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
layui-laydate时间日历控件使用方法详解
Nov 15 Javascript
简单了解vue.js数组的常用操作
Jun 17 Javascript
vue组件系列之TagsInput详解
May 14 Javascript
在HTML中使用JavaScript的两种方法
Dec 24 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中output_buffering
2015/07/13 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
python制作图片缩略图
2019/04/30 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
python requests使用socks5的例子
2019/07/25 Python
python实现翻译word表格小程序
2020/02/27 Python
Python装饰器用法与知识点小结
2020/03/09 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
《傅雷家书》教学反思
2014/04/20 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
详解Vue的列表渲染
2021/11/20 Vue.js