uniapp图片转base64及JS各文件类型相互转换

news2025/4/19 7:12:19

uniapp图片转base64及JS各文件类型相互转换

  • 1、chooseImage + request + arrayBufferToBase64
  • 2、chooseImage + getFileSystemManager
  • 3、chooseImage + FileReader
  • 4、扩展-JS各文件类型相互转换
    • 4.1 File 转成 ArrayBuffer
    • 4.2 File 转成 blob
    • 4.3 File 转成 base64
    • 4.4 ArrayBuffer 转成 blob
    • 4.5 ArrayBuffer 转成 File
    • 4.6 Blob 转成 ArrayBuffer
    • 4.7 Blob 转成 File
    • 4.8 base64 转成 Blob
    • 4.9 base64 转成 File
    • 4.10 base64 转成 ArrayBuffer

1、chooseImage + request + arrayBufferToBase64

AppH5微信小程序快手小程序京东小程序

功能限制主要在arrayBufferToBase64
在这里插入图片描述

getImg() {
	uni.chooseImage({
		success: async (res) => {
			// 等待全部完成后再接收结果
			let base64List = await Promise.all(res.tempFiles.map((item, index) => {
				return this.tempToBase64(item)
			}))
		}
	})
},
tempToBase64(tempFiles) {
	return new Promise((resolve, reject) => {
		wx.request({
			url: tempFiles.path,
			responseType: 'arraybuffer',
			success: (res) => {
				
				// 避免获取不到文件类型
				if (!tempFiles.type) {
					uni.getImageInfo({
						src: tempFiles.path,
						success: (image) => {
							// 把arraybuffer转成base64并拼接
							resolve(`data:image/${image.type};base64,${uni.arrayBufferToBase64(res.data)}`)
						},
						fail: (err) => {
							reject(err)
						}
					});
				}
				// //把arraybuffer转成base64并拼接
				else resolve(`data:${tempFiles.type};base64,${uni.arrayBufferToBase64(res.data)}`)
			},
			fail: (err) => {
				reject(err)
			}
		})
	})
}

2、chooseImage + getFileSystemManager

微信小程序字节跳动小程序QQ小程序

功能限制主要在getFileSystemManager
在这里插入图片描述

getImg() {
	uni.chooseImage({
		success: async (res) => {
			let base64List = await Promise.all(res.tempFiles.map((item, index) => {
				return this.tempToBase64(item)
			}))
			console.log(base64List)
		}
	})
},
tempToBase64(tempFiles) {
	return new Promise((resolve, reject) => {
		uni.getFileSystemManager().readFile({
			filePath: tempFiles.path,
			encoding: 'base64',
			success: (res) => {
				// 避免获取不到文件类型
				if (!tempFiles.type) {
					uni.getImageInfo({
						src: tempFiles.path,
						success: (image) => {
							// 拼接成完整的base64
							resolve(`data:image/${image.type};base64,${res.data}`)
						},
						fail: (err) => {
							reject(err)
						}
					});
				} 
				// 拼接成完整的base64
				else resolve(`data:${tempFiles.type};base64,${res.data}`)

			},
			fail: (err) => {
				reject(err)
			}
		})
	})
}

3、chooseImage + FileReader

H5

功能限制主要在FileReader实例上

getImg() {
	uni.chooseImage({
		success: async (res) => {
			// 等待全部完成后再接收结果
			let base64List = await Promise.all(res.tempFiles.map((item, index) => {
				return this.tempToBase64(item)
			}))
		}
	})
},
tempToBase64(tempFiles) {
	return new Promise((resolve, reject) => {
		///专门用来读文件的工具类
		const reader = new FileReader();
		reader.readAsDataURL(tempFiles);
		reader.onload = () => resolve(reader.result);
		reader.onerror = (error) => reject(error);
	});
}

4、扩展-JS各文件类型相互转换

在 JavaScript 中的经常用到的二进制的格式有三种:

  • ArrayBuffer:用来表示通用的、固定长度的原始二进制数据缓冲区;
  • Blob:表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作;
  • File:特殊类型的 Blob,且可以用在任意的 Blob 类型的 context 中。

原生js中文件处理通常使用FileReader。

  • FileReader对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容。

base64转换中通常会用到atob/btoa

  • atob对经过 base-64 编码的字符串进行解码。
  • btoa可以将一个二进制字符串编码为 Base64 编码的 ASCII 字符串。

4.1 File 转成 ArrayBuffer

function fileToArrayBuffer(file){
	return new Promise((resolve, reject) => {
		///专门用来读文件的工具类
		let reader = new FileReader();
		reader.readAsArrayBuffer(file);
		reader.onload = () => resolve(reader.result);
		reader.onerror = (error) => reject(error);
	});
}

4.2 File 转成 blob

File特殊类型的 Blob,通常不需要转换,需要转换时可以利用 FileReader 中转。

fileToBlob(file) {
	return new Promise((resolve, reject) => {
		///专门用来读文件的工具类
		let reader = new FileReader();
		reader.readAsArrayBuffer(file);
		reader.onload = () => resolve(new Blob([reader.result]);
		reader.onerror = (error) => reject(error);
	});
}

4.3 File 转成 base64

function fileToBase64(file) {
	return new Promise((resolve, reject) => {
		///专门用来读文件的工具类
		const reader = new FileReader();
		reader.readAsDataURL(file);
		reader.onload = () => resolve(reader.result);
		reader.onerror = (error) => reject(error);
	});
}

4.4 ArrayBuffer 转成 blob

function arrayBufferToBlob(arraybuffer) {
	return new Blob([arraybuffer]);
}

4.5 ArrayBuffer 转成 File

function arrayBufferToBlob(arraybuffer, filename = 'tempArrayBuffer') {
	new File([arraybuffer], filename )
}

4.6 Blob 转成 ArrayBuffer

function blobToArrayBuffer(blob) {
	return new Promise((resolve, reject) => {
		///专门用来读文件的工具类
		let reader = new FileReader();
		reader.readAsArrayBuffer(blob);
		reader.onload = () => resolve(reader.result);
		reader.onerror = (error) => reject(error);
	});
}

4.7 Blob 转成 File

File特殊类型的 Blob,通常不需要转换,需要转换时可以利用 FileReader 中转。

fucntion blobToFile(blob, filename = 'tempBlob') {
	return new Promise((resolve, reject) => {
		///专门用来读文件的工具类
		let reader = new FileReader();
		reader.readAsArrayBuffer(blob);
		reader.onload = () => resolve(new File([reader.result], filename ))
		reader.onerror = (error) => reject(error);
	});
}

4.8 base64 转成 Blob

base64toBlob(base64) {
	let arr = base64.split(',');
	let bstr = atob(arr[1]);
	let n = bstr.length;;
	let u8arr = new Uint8Array(n);
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n);
	}
	return new Blob([u8arr], {
		type: arr[0].match(/:(.*?);/)[1]
	});
},

4.9 base64 转成 File

base64toFile(base64, filename = 'file') {
	let mime = arr[0].match(/:(.*?);/)[1];
	// suffix是该文件的后缀
	let suffix = mime.split('/')[1];
	// atob 对经过 base-64 编码的字符串进行解码
	let bstr = atob(base64.split(',')[1]);
	// n 是解码后的长度
	let n = bstr.length;
	// Uint8Array 数组类型表示一个 8 位无符号整型数组 初始值都是 数子0
	let u8arr = new Uint8Array(n);
	// charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n);
	}
	// new File返回File对象 第一个参数是 ArraryBuffer 或 Bolb 或Arrary 第二个参数是文件名
	// 第三个参数是 要放到文件中的内容的 MIME 类型
	return new File([u8arr], `${filename}.${suffix}`, {
		type: mime,
	});
},

4.10 base64 转成 ArrayBuffer

function base64ToArrayBuffer(base64){
   let text = new TextEncoder()
   return text.encode(btoa(base64))
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】前序遍历,中序遍历,后序遍历(二叉树)

一:给图求前序,中序,后序 前序遍历(先序遍历) 核心思想:根左右 前序序列:ABDEFCGH 先访问根结点A,打印A,然后访问左子树,此时左子树B又作为根节点&#xf…

JAVAWeb05-xml、DOM4J

1. xml概述 1.1 官方文档 地址: https://www.w3school.com.cn/xml/index.asp 1.2 为什么需要 XML 需求 1 : 两个程序间进行数据通信?需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有…

【数字人】使用Metahuman创建数字人模型(上)

这两年数字人类的概念可谓是风头正盛,市面上也流行起各式各样的数字人技术,效果能力及实现成本各不相同。本系列介绍基于Unreal Engine的Metahuman工具低成本构建一个拥有完整的控制权、免费、可商用、高仿真的数字人。本篇为构建基础人物模型 MetaHuma…

PHP快速入门14-Composer包管理安装与使用,附常见的20个使用例子

文章目录 前言一、关于Composer二、如何安装Composer2.1 Windows安装Composer2.2 Linux安装Composer 三、Composer常见的20个使用例子3.1 查找并安装依赖包3.2 更新依赖包3.3 安装指定版本的依赖包3.4 卸载依赖包3.5 查看当前项目依赖包列表3.6 初始化composer.json文件3.7 安装…

FAT32文件系统学习

FAT32文件系统组成及介绍 FAT32文件系统结构图: 下图演示了FAT32文件系统的DBR: 1.DBR及其保留扇区:含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往往有一些保留扇区 跳转指令:跳转指令本身占用2字…

python程序打包成可执行文件【进阶篇】

python程序打包成可执行文件【进阶篇】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 python程序打包成可执行文件【进阶篇】[TOC](文章目录) 前言安装PyInstaller包打包深度学习模型生成spec文件修改spec文件运行spec文件进行打包执行exe可执…

为什么倒谱可以分析回声

一个有趣的现象:倒谱上的第一个峰,恰好对应回声相比原声的延时。回声 y y y 是原始声音 x x x 延迟 t 0 t_0 t0​ 秒后的、带有衰减 α α α 的副本 y α x ( t − t 0 ) y αx (t - t_0) yαx(t−t0​) 方便起见,这里取 α 1 α …

抖音强势入局服装生意,出手就是1个亿,服装实体店出路在哪?

最近,抖音盯上了服装生意。 据悉,抖音近期组建了一个自营服装团队,在APP推出了一家“飞云织上”的店铺,店铺主体公司是“上海歆湃信息科技有限公司”。 根据爱企查显示,这家公司由抖音集团(香港&#xff09…

RabbitMQ-消息模型

什么是MQ MQ全称是Message Queue,即消息对列!消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没…

IPV4与IPV6是什么?有什么区别?

目录 一. IPV4是什么? 二. IPV6是什么 三. IPv4和IPv6有什么区别? 1.地址类型 2.数据包大小 3.header区域字段数 4.可选字段 5.配置 6.安全性 7.与移动设备的兼容性 8.主要功能 IP协议(互联网协议)是互联网协议群&#…

USB TO SPI / USB TO I2C 软件概要 6--- 专业版调试器

所需设备: 1、USB转SPI_I2C适配器(专业版); 软件概述: SPI类: USB TO SPI 1.0-Slave SPI从机软件,适合单步调试,支持SPI工作模式0、1、2、3,自动跟随主机通讯速率,自动接收数据; USB TO S…

大城市的IT岗位,饱和了么?

现在学或即将更要学习IT专业的同学,经常会考虑这样一个问题:现在的计算机专业到处都有,大学里有、职业学校有,就连社会上的培训机构也有,而且专业分类更细化,有这么多的地方都在培训计算机相关专业&#xf…

二本4年测龄年仅25岁,五面阿里(定薪25K).....

体验了一下阿里的面试,不愧是大厂,考察范围既有深度也有宽度。努力回想了下面试的内容和自己当时的回答,这里给大家分享下自己的经验,也给自己做个归档,希望能给正在准备跳槽,找工作的朋友一点帮助&#xf…

每一个软件测试工程师都有要牢记的误区

最近跟一些刚刚进入软件测试行业的朋友去交流,发现了一个有趣的现象,就是对于这个行业的很多问题的认识都是一致的片面,当然也可以理解为误区。自己利用一点时间,把他们对于这个行业的认识误区都罗列出来,然后结合自己…

【Python从入门到进阶】16、文件的打开和关闭

接上篇《15、函数的定义和使用》 上一篇我们学习了Python中函数的定义和使用,包括函数的参数、返回值、局部变量和全景变量等操作。从本篇开始我们来开始学习Python对文件的一些操作,本篇我们主要讲解如何使用Python打开和关闭文件。 一、打开/创建文件…

全国青少年编程等级考试scratch四级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级(2019年3月)在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.编写一段程序,从26个英文字母中,随机选出10个加入列表a。空白…

【id:45】【20分】A. Equation(类与对象+构造)

题目描述 建立一个类Equation,表达方程ax2bxc0。类中至少包含以下方法: 1、无参构造(abc默认值为1.0、1.0、0)与有参构造函数,用于初始化a、b、c的值; 2、set方法,用于修改a、b、c的值 3、ge…

JSP原理

1.什么是JSP Java Server Page:Java服务器端页面,也和Servlet一样,用于动态Web技术 最大的特点:写JSP就像再写HTML 页面生成了java JSP本质上就是servlet 3.输出页面前增加的代码 1.response.setContentType("text/html"); //设…

C++ ubuntu环境下安装编译部署环境,用onnxruntime部署ppyoloe_r模型

在新安装的ubuntu环境下修改源、安装gcc和cmake,编译安装opencv,安装onnxruntime环境。并编写cmakelist文件,编译与运行ppyoloe_r模型。 windows环境下onnx部署ppyoloe_r模型的代码可以参考 https://blog.csdn.net/a486259/article/details/1…

Python-入门基础小练习

通过前面的两个篇章Python-入门基础篇和Python-入门基础语句篇大家应该已经认识了python基础的语句和函数了,并且可以使用pycharm编译器创建.py文件进行运行了,今天适当的来一些小练习,给枯燥的学习增添一些趣味性。 判断一个数是否为偶数 …