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文件,下载为一个压缩包 的相关文章

  • 为什么省略分号会破坏这段代码?

    或者换句话说 为什么分号插入失败 导致下面的代码被破坏 function Foo Foo prototype bar function console log bar lt missing semicolon function Foo pr
  • 如何将值发布到输入框中?

    Intro I would like to get the current time after clicking at click and POST the value into input text box Note 假设包含引导样式表
  • JavaScript 字符串中的脚本标签[重复]

    这个问题在这里已经有答案了 我遇到一个问题 即 JavaScript 中带引号的字符串内有结束脚本标记 并且它正在杀死脚本 我认为这不是预期的行为 可以在这里看到这样的示例 http jsbin com oqepe edit http js
  • 获取被调用的 javascript 文件的查询字符串

    是否可以在调用的 javascript 文件上使用 javascript 获取查询参数 如下所示 in html in file js console log this location query 这是否可能以某种方式实现 或者我必须使用
  • 如何将 Ajax.BeginForm MVC 助手与 JSON 结果一起使用?

    我正在尝试使用 ASP NET MVC Ajax BeginForm 帮助程序 但不想在调用完成时使用现有的内容插入选项 相反 我想使用自定义 JavaScript 函数作为回调 这可行 但我想要的结果应该以 JSON 形式返回 不幸的是
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • 我可以在 GWT 中使用第三方 Javascript 库吗

    例如穆工具 用 js 编码对我来说很舒服 但显然不适合所有人 你当然可以 最好的事情就是给自己写一些好看的JavaScript 覆盖类型 http code google com webtoolkit doc latest DevGuide
  • EmberJS:对象作为查询参数来刷新模型

    我遵循了查询参数指南 http guides emberjs com v1 11 0 routing query params http guides emberjs com v1 11 0 routing query params 而且效
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • 如何封装Vuejs项目中的常用功能?最佳实践

    我正在开发一个使用 Vuejs 作为前端的中型项目 我正在探索的封装 分离可能在许多组件中使用的常用方法的选项包括 mixins 方法和插件方法 混合方法我必须在每个要使用 mixin 方法的组件 文件 中编写一条 import 语句 由于
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • ES6 模块范围

    我有代码 lib js var a a export var b b main js console log a a variable is not available in a global scope import b from lib
  • 如何在React中动态分配属性?

    这是一个有两个参数的函数 我要创建的标签的名称 具有以下属性的对象 Using React 我创建一个组件并将该元素渲染到 DOM 问题是我想向元素添加属性 但它不允许循环在元素内设置属性 var Element function elem
  • 轮播滑动(未滑动)事件上的火灾事件,Bootstrap 3

    Bootstrap 2 似乎可以很好地处理幻灯片事件 请参阅这个问题 https stackoverflow com questions 9651466 how to attach slide slid events to the boot
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • Graphql 将多个查询合并(组合)为一个?

    我正在尝试使用 JavaScript 将多个 GraphQL 查询合并为一个查询 我正在寻找这样的东西 let query3 mergeQueries query1 query2 我们事先不知道哪些查询将被组合 假设我有这样的查询 输入查询
  • Vue - 调度完成后调用 store getter?

    我正在使用 Laravel 5 7 Vue2 Vuex 我在调度调用完成后让 Vue 返回存储值时遇到一些困难 我的申请流程如下 我单击一个提交按钮 该按钮调用组件上的 validate Validate 分派到我的 addLease 操作
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial

随机推荐

  • [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