uniapp使用jsZip打包多个url文件,下载为一个压缩包

2023-10-31

1.需求及前言

可选中多个文件(类型不限png、doc、xls、ppt等)点击下载时,将选中的文件全部打包成一个压缩包给用户。
本文讲解jszip这个插件的打包下载使用方法。

2.下载插件

npm install file-saver
npm install jszip

2.导入

import JSZip from 'jszip'
import FileSaver from 'file-saver'

3.封装为mixins文件

在项目根目录下新建mixins目录, mixins目录下新建blob.js文件
blob.js 代码

// blob.js

import { REFRESH_TOKEN, ACCESS_TOKEN } from '@/common/const.js'
import { getToken, getTokenAsnc, saveAccessToken } from '@/common/util/token'
import { baseApi } from '@/config/index.js'
import FileSaver from 'file-saver'
import JSZip from 'jszip'
export default {
	data() {
		return {
			header: {}
		};
	},
	methods: {
		// 在混入的父文件内直接调用即可
		// 传入的fileList参数格式为 [{name: '文件名',type: 'doc', url: 'http:xxxx'}]
		handleDownload(fileList=[]) {
			const zip = new JSZip()
			const cache = {}
			const promises = []
			fileList.forEach(item => {
				const promise = this.getblob(item.url).then(data => {
					const name = item.name
					zip.file(name + '.' + item.type, data, {
						binary: true
					})
					cache[name] = data
				})
				promises.push(promise)
			})
			Promise.all(promises).then(() => {
				zip.generateAsync({
					type: 'blob'
				}).then(content => {
					console.log(content, promises);
					// 利用file-saver保存文件  自定义文件名
					saveAs(content, '文件下载.zip')
					// 下载成功提示
					this.$message({
						type: 'success',
						message: '下载成功!'
					})
				})
			})
		},
		// 从接口获取blob文件流
		async getblob(url) {
			// 请求头携带参数
			const accessToken = await getTokenAsnc(ACCESS_TOKEN)
			if (accessToken) {
				this.header.Authorization = accessToken
			} else {
				const refreshToken = await getTokenAsnc(REFRESH_TOKEN)
				if (refreshToken) {
					this.header.Authorization = refreshToken
				}
			}
			this.header["DeviceId"] = uni.$u.sys().deviceId
			
			return new Promise((resolve, reject) => {
				// 图片blob流
				uni.request({
					url: `${baseApi}v3/disk/downloadFile`, // 接口地址
					data: {
						path: url
					},
					responseType: 'arraybuffer', // 如道友用的uniapp 则响应格式设置为arraybuffer
					// responseType: 'blob', // 其他框架 可试试响应格式设置为blob
					header: {
						'Access-Control-Allow-Origin': '*', // 设置可以跨域
						...this.header // 请求头带的token等参数
					},
					success: (content) => {
						resolve(content.data)
					}
				});
			})
		},
	}
};

4.页面混入

在已混入的页面直接调用传参即可
index.vue

<template>
	<view>
		<button @click="downLoad">下载</button>
	</view>
</template>
<script>
	import blob from '@/mixins/blob.js'
	export default {
	mixins: [blob],
		data(){
			return{
				multipleSelection: [{
	          		"id": 18,
	                "create_time": "2023-07-31 11:31:44",
	                "name": "测试上传文件",
	                "type": "doc",
	                // 如该url地址不可用 可替换为自己的http url地址
	                "url": "https://saierwei-cms.oss-cn-shenzhen.aliyuncs.com/cms/file/20230731/16907743043735595.doc",
	                "size": null
	            }, {
	                "id": 25,
	                "create_time": "2023-08-02 10:24:19",
	                "name": "微信图片_20230324153545",
	                "type": "jpg",
	                "parent_id": 0,
	                "url": "https://saierwei-cms.oss-cn-shenzhen.aliyuncs.com/cms/images/20230802/16909430583905219.jpg",
	                "size": null
	            },{
	                "id": 31,
	                "create_time": "2023-08-02 10:54:10",
	                "name": "新建 PPT 演示文稿",
	                "type": "ppt",
	                "user_id": 135,
	                "url": "https://saierwei-cms.oss-cn-shenzhen.aliyuncs.com/cms/file/20230802/16909448504666375.ppt",
	                "size": 20992.0
	            }]
			}
		},
		methods: {
			downLoad() {
				this.handleDownload(this.multipleSelection)
			},
		}
	}
</script>

5.总结

1、在项目根目录下新建mixins目录
2、在新建mixins目录创建blob.js文件
3、在需要的页面混入blob.js(如下图)
4、调用handleDownload方法直接使用
在这里插入图片描述
各位道友下载好插件后,可直接复制上面两个文件到项目中进行体验。

注:可能在上述代码中出现跨域问题,如出现跨域问题可参考 跨域解决办法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uniapp使用jsZip打包多个url文件,下载为一个压缩包 的相关文章

  • 如何修复 Nuxt 中导航器/窗口/文档未定义的问题

    我试图确定 Nuxt 应用程序内的 UserAgent 和 Retina 信息 但应用程序抛出错误并显示导航 窗口未定义 我如何在 nuxt 应用程序中获取这些信息 const userAgent navigator userAgent t
  • React 渲染中的不变违规或 React 中迭代和返回的正确方法

    我在 React 渲染中遇到了持续存在的问题 这段代码 jsx React DOM var AnswerRows React createClass componentDidMount function render function th
  • 如何使用 axios / jest 测试失败的请求

    我创建了一个非常小的应用程序 如果您传递硬币和数量 它可以计算为某些加密货币支付的总价格 我想测试错误 但我总是收到 收到的承诺已解决而不是被拒绝 我相信这是因为如果 url 错误 axios 仍然会解决承诺 我遇到的第二个问题是 我尝试测
  • 通过 SVG 背景传递鼠标事件

    我有两个 SVG 元素 每个元素覆盖整个屏幕 html body height 100 svg position absolute top 0 left 0 bottom 0 right 0
  • 检查 DOM 元素是否为复选框

    如何检查给定的 DOM 元素是否为复选框 设想 我有一组文本框和复选框 其中的值是动态分配的 我没有办法识别 DOM 元素是复选框还是文本框 只使用普通的 javascript 你就可以做到 if el type el type check
  • 零作为 IIFE 中的第一个参数[重复]

    这个问题在这里已经有答案了 In babeljs v6 5 1 class Foo 编译为 use strict var classCallCheck2 require babel runtime helpers classCallChec
  • Chrome SuppressDifferentOriginSubframeJSDialogs 使用 JS 设置覆盖?

    Chrome 开发团队显然刚刚推出了一项名为 SuppressDifferentOriginSubframeJSDialogs 的新 功能 这使得默认情况下不会显示来自与父级不同域上的 iFrame 的警报 确认框 https www ch
  • 为什么将数据存储为元素的属性存在风险?

    我一直在读同样的东西 直接在 DOM 元素上存储属性值是有风险的 因为可能会发生内存泄漏 但有人可以更详细地解释这些风险吗 按属性 我假设您指的是 DOM 元素上的属性 DOM 元素上的自定义属性安全吗
  • JQuery 动画文本

    找到简单 简单的动画文本是非常困难的 喜欢这个网站上的 内爆 http codecanyon net item jquery text animation full screen preview 233445 http codecanyon
  • 在 Angular2 项目中集成 Treant-js

    我正在尝试在 Angular2 项目中使用 treant js 但我正在努力解决如何正确集成它的问题 我有一个工作正常的 JavaScript HTML 示例 我正在尝试在 Angular2 中工作 我创建了一个组件 从 npm 添加了 t
  • 使用 jQuery 仅从字符串末尾修剪空格

    我知道 jQuery trim 函数 但我需要的是一种仅从字符串末尾修剪空格的方法 而不是开头 So str this is a string 会成为 str this is a string 有什么建议么 Thanks 您可以使用正则表达
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • setInterval 内的返回值

    我想在 setInterval 内返回一个值 我只想以一定的时间间隔执行一些操作 这就是我尝试过的 function git limit var i 0 var git setInterval function console log i
  • 使用 JavaScript 的计时器

    我想使用java脚本实现计时器 我想随着间隔的变化而减少计时器 Example假设我的计时器从 500 开始 我想要根据级别减少计时器 例如1 一级定时器应减1 且递减速度应较慢 2 2级定时器应递减2 递减速度应为中等3 3级定时器应减3
  • 理论上防止 WebSocket 中第一个收到的消息丢失

    服务器端代码发送消息立即地连接打开后 它向客户端发送初始配置 问候语 以下代码是在客户端 var sock new WebSocket url sock addEventListener error processError sock ad
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 错误:创建 React Native 项目版本 0.59.9 时找不到 template.config.js

    当我尝试创建 React Native 项目版本 0 59 9 时 出现以下错误 错误错误 无法在 react native 模板中找到 var folders zc h93bvpb573q24 5ynvgkn1wc0000gn T rnc
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • Serviceworker Bug event.respondWith

    我的 serviceworker 的逻辑是 当发生获取事件时 它首先获取包含一些布尔值 而不是 event request url 的端点 并根据我正在调用的值检查该值event respondWith 对于当前的获取事件 我正在提供来自缓
  • 使用 Lodash 将对象键转换为具有键值数量的数组[重复]

    这个问题在这里已经有答案了 我有一个产品对象 products bread 1 milk 2 cheese 2 chicken 1 我想要一个包含产品名称的数组 如下所示 products bread milk milk cheese ch

随机推荐

  • [Eagle API]使用python保存所有文件夹层级信息

    api https www yuque com augus gsjgn eagle api pq0y2y var requestOptions method GET redirect follow fetch http localhost
  • 【学习笔记】R数据科学(R for Data Science)—第1章 使用ggplot2进行数据可视化

    1 代码模板 ggplot data
  • IDEA mvn 命令作用介绍

    idea工具maven projects里面有9种生命周期 今天刚好遇到 顺便分享下自己的理解 生命周期是包含在一个项目构建中的一系列有序的阶段 最常用的两种打包方法 一 clean package 如果报错 很可能就是jar依赖的问题 二
  • 我们到底是不是产品经理

    产品究竟是什么 百度百科的解释 产品是一组将输入转化为输出的相互关联或相互作用的活动的结果 其实理解的更直白一点 产品就是用来解决莫个问题的东西 现在我们用的键盘 显示器 水杯 包括买东西时导购员的服务都是产品 也就是说产品这个东西可以是有
  • 从零开始学习React——(七):React列表循环数据以及事件绑定

    本节主要介绍React中列表循环展示数据以及事件的绑定 1 列表循环数据化 目前Child js组件中的 li 标签内的数据是静态的 也就是死的 如果要换成动态的 就需要把这个列表进行数据化之后再用JavaScript代码循环在页面上 首先
  • [systemc][tlm2.0]父模块与子模块的实现

    一 windows下环境配置 尝试1 visual studio 配置systemc环境 systemC学习笔记3 vs开发环境搭建 知乎 zhihu com 32 封私信 80 条消息 流浪码农 知乎 zhihu com 之前配置总是不通
  • pb_ds实现可重复set

    简单来说 就是将数据类型改为pair 保证值不同就行 less
  • 基于vue的picker组件

    概述 基于vue js选择器组件 github https github com xiecg vue DEMO vue picker 安装 npm install vue 3d picker save import picker from
  • 解决freemarker数组中的对象属性获取不到

    1 问题现象 使用Freemarker写入模板的时候 遍历List的时候发现对象中的首字母大写和带下划线的时候就会报错 The following has evaluated to null or missing FTL stack tra
  • 基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器

    基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器 文章目录 基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器 搭建自己的repo代码服务器 流程框图 环
  • Markdown自定义CSS样式

    前言 当我第一次接触到Markdown时 我就深深爱上了它 这简洁的界面 编程式的书写都令我爱不释手 最重要的是 还能够支持自定义html css 自定义CSS样式 说到Markdown 就不得不提及Typora这个软件 本例子即是在此软件
  • 解决vue3类型“{}”上不存在属性

    刚创建的一个Vue3和Ts的项目 结果使用Vscode打开后 修改了index vue文件就报错了 修改tsconfig json文件 在tsconfig json文件中添加一行代码 就是让ts识别vue文件 include src ts
  • Ubuntu虚拟机中网络中没有网卡

    由于断电等异常操作 导致vmware的ubuntu系统连接不到网络 ping www baidu com 提示 name or service not known 查看网卡配置 vi etc network interfaces 结果发现只
  • Circular placeholder reference 'server.port' in property definitions

    Exception in thread main java lang IllegalArgumentException Circular placeholder reference server port in property defin
  • Cannot run program "scripts\saveVersion.sh"

    用Maven 编译hadoop遇到以下错误 saveVersion sh script fails in windows cygwin hadoop yarn common 半天是个bug 解决方案如下 Index hadoop mapre
  • C++常用经典算法总结

    一 算法概述 排序算法可以分为两大类 非线性时间比较类排序 通过比较来决定元素间的相对次序 由于其时间复杂度不能突破O nlogn 因此称为非线性时间比较类排序 线性时间非比较类排序 不通过比较来决定元素间的相对次序 它可以突破基于比较排序
  • C#如何通过存储过程从数据库中获得数据

    存储过程就是在数据库中写好的函数 C 通过调用存储过程来获得数据 可以在一定程度上提高数据库的安全性 将一些重要的数据封装了起来 那么如何在C 中调用存储过程呢 一 存储过程 环境如下 1 数据库Itcast2014中包含表TblStude
  • VS的C++项目添加LAPACK库简便方法(注:64位+32位,且不用自己编译库)

    需要材料 1 已经编译好的库文件 dll文件和头文件 http icl cs utk edu lapack for windows lapack libraries 这个网站中有已经用minGW编译好的LAPACK库 lib 一共有三个 除
  • 实践DIV+CSS网页布局入门指南

    实践DIV CSS网页布局入门指南 你正在学习CSS布局吗 是不是还不能完全掌握纯CSS布局 通常有两种情况阻碍你的学习 第一种可能是你还没有理解CSS处理页面的原理 在你考虑你的页面整体表现效果前 你应当先考虑内容的语义和结构 然后再针对
  • uniapp使用jsZip打包多个url文件,下载为一个压缩包

    1 需求及前言 可选中多个文件 类型不限png doc xls ppt等 点击下载时 将选中的文件全部打包成一个压缩包给用户 本文讲解jszip这个插件的打包下载使用方法 2 下载插件 npm install file saver npm