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 相关文章推荐
FormValidate 表单验证功能代码更新并提供下载
Aug 23 Javascript
Javascript 学习书 推荐
Jun 13 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
超级简单的jquery操作表格方法
Dec 15 Javascript
JS+CSS实现闪烁字体效果代码
Apr 05 Javascript
AngularJS基础 ng-include 指令示例讲解
Aug 01 Javascript
基于JQuery及AJAX实现名人名言随机生成器
Feb 10 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
Feb 27 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
基于ES6 Array.of的用法(实例讲解)
Sep 05 Javascript
js+SVG实现动态时钟效果
Jul 14 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获取网卡地址的代码
2008/04/09 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
php数据库备份还原类分享
2014/03/20 PHP
PHP生成条形图的方法
2014/12/10 PHP
分享PHP守护进程类
2015/12/30 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
任意位置显示html菜单
2007/02/01 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
python pdb调试方法分享
2014/01/21 Python
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python 批量将中文名转换为拼音
2021/02/07 Python
毕业生求职简历的自我评价
2013/10/23 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
车辆转让协议书
2014/09/24 职场文书
商务邀请函
2015/01/30 职场文书
2015年护士节活动总结
2015/02/10 职场文书
安全保证书格式
2015/02/28 职场文书
初中政教处工作总结
2015/08/12 职场文书
外出考察学习心得体会
2016/01/18 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python