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 相关文章推荐
FormValid0.5版本发布,带ajax自定义验证例子
Aug 17 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
Jun 24 Javascript
javascript Slip.js实现整屏滑动的手机网页
Nov 25 Javascript
SWFUpload多文件上传及文件个数限制的方法
May 31 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
Nov 12 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
Jan 04 Javascript
layui表格实现代码
May 20 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 Javascript
微信小程序实现禁止分享代码实例
Oct 19 Javascript
微信小程序语音同步智能识别的实现案例代码解析
May 29 Javascript
JavaScript中的全局属性与方法深入解析
Jun 14 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
Oct 29 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
中国第一家无线电行
2021/03/01 无线电
php中的一个中文字符串截取函数
2007/02/14 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
JS中promise化微信小程序api
2018/04/12 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
Python中的sort()方法使用基础教程
2017/01/08 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
python 通过exifread读取照片信息
2020/12/24 Python
HTML5的结构和语义(3):语义性的块级元素
2008/10/17 HTML / CSS
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
记者岗位职责
2014/01/06 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
机电专业求职信
2014/06/14 职场文书
仓库管理员岗位职责
2015/02/03 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL