uniapp不同平台获取文件内容以及base64编码特征

前言

文件图片上传,客户端预览是很正常的需求,获取文件的md5特征码也是很正常的,那么,在uniapp中三种环境,h5, 小程序以及 app环境下,如何实现的?
参考:
如何在uniapp中读取文件ArrayBuffer和sha256哈希值,支持H5、APP、小程序

uniapp 没有提供跨平台的 API 来获取文件的 sha256 哈希值和读取文件的 ArrayBuffer,因此需要开发者自己手动兼容各个平台。在小程序端使用FileSystemManager、app 端是plus.io、H5 端是FileReader,这些 API 都是平台特有的,而且实际调用存在各种问题,也缺乏相关教程

uniapp-微信小程序-图片转base64

ps:只适合小文件上传,大文件的话不要用这个。计算md5的时候采用了sparkMD5,请自行安装。

具体实现

必须要知道的是文件的临时路径,就是:
http://xxxxx 形式的

例如:

// 读取图像文件
uni.chooseImage({count: 9,sizeType: ['original', 'compressed'],sourceType: ['album', 'camera'],success: (res) => {const tempFilePaths = res.tempFilePaths// tempFilePaths 是一个数组,可以通过索引获取图片路径,比如tempFilePaths[0],我们需要的就是这个路径},
})

或者

	uni.chooseMedia({count:1,// 限制选取图像数量mediaType:["image"],// 设置选取资源为图片类型sourceType:["album","camera"],// 设置图像来源:相册或相机camera:"back",// 设置相机为后置摄像头success:(res)=>{// 获取微信拿到的图片的临时地址并保存到本地this.photoPath=res.tempFiles[0].tempFilePath;}})
},

小程序获取 ArrayBuffer以及读取base64:

arrayBuffer:
// 小程序,filePath 是一个本地文件路径
const fs = uni.getFileSystemManager()
return fs.readFileSync(filePath)
base64:
// (由于uniapp开发所以uni打头)
uni.getFileSystemManager().readFile({// 【重点来啦】人家自提供的转码APIfilePath:image.path,// 所需转码图像路径encoding:"base64",// 转码类型success:(res)=>{// 生成base64let imageBase64='data:image/'+image.type+';base64,'+res.data;console.log('转base64后:',imageBase64);}
})

H5获取 ArrayBuffer以及读取base64:

const blobURLToBlob = (url) => {return new Promise((resolve, reject) => {var http = new XMLHttpRequest()http.open('GET', url, true)http.responseType = 'blob'http.onload = function (e) {if (this.status == 200 || this.status === 0) {resolve(this.response)} else {reject(this.status)}}http.send()})
}//  通过blob:url读取实际的ArrayBuffer数据
const H5ReadBlobUrlArrayBuffer = (blobUrl) => {return new Promise(async (resolve, reject) => {try {const reader = new FileReader()// blob数据转file对象数据const fileBlob: any = await blobURLToBlob(blobUrl)const file = new window.File([fileBlob], 'file.name', { type: 'file.type' })// 读取file对象ArrayBufferreader.readAsArrayBuffer(file)reader.onload = function (e) {resolve(e?.target?.result)}} catch (e) {reject(e)}})
}
//  通过blob:url读取实际的base64:
const H5ReadBlobUrlBase64 = (blobUrl) => {return new Promise(async (resolve, reject) => {try {const reader = new FileReader()// blob数据转file对象数据const fileBlob: any = await blobURLToBlob(blobUrl)const file = new window.File([fileBlob], 'file.name', { type: 'file.type' })// 读取file对象ArrayBufferreader.readAsDataURL(file)reader.onload = function (e) {resolve(e?.target?.result)}} catch (e) {reject(e)}})
}注意:实际上 h5都是使用fileReader的api来读取的,arrayBuffer是:readAsArrayBuffer,而base64是readAsDataURL,不但图片,文件也能这样读取base64的。

APP获取 ArrayBuffer以及读取base64:

const H5PlusReadFileArrayBuffer = (filePath) => {return new Promise((resolve, reject) => {try {plus.io.resolveLocalFileSystemURL(filePath,function (entry) {entry?.file(function (file) {const fileReader = new plus.io.FileReader()fileReader.readAsDataURL(file, 'utf-8')fileReader.onloadend = function (evt) {const result = {base64: evt.target.result.split(',')[1],size: file.size,}resolve(uni.base64ToArrayBuffer(result.base64))}})},function (error) {reject(error)},)} catch (error) {reject(error)}})
}

app方面是直接先读取base64,再读取arrayBuffer,所以一气呵成。

综合:

import  SparkMD5 from 'spark-md5';
export interface FileReaderInfo {fileHeader64:string;//--base64形式的文件前一段内容,用于传递magicNumber进行判断。base64:string;arrayBuffer:any;tempPath:string;//形式如下:blob:http://localhost:3000/5fd140d3-1372-4394-8b08-0cba8c508099mime:string;errMsg?:string;md5:string,//--获取文件md5.
}// #ifdef H5
// 通过blob:url读取实际的blob数据
function  h5_blobURLToBlob  (url:string) :Promise<any> {return new Promise((resolve, reject) => {var http = new XMLHttpRequest();http.open('GET', url, true)http.responseType = 'blob';http.onload = function (e) {if (this.status == 200 || this.status === 0) {resolve(this.response)} else {reject(this.status)}};http.send()})
}//  通过blob:url读取实际的ArrayBuffer数据function H5ReadBlobUrl(blobUrl:string,mimeType:string): Promise<FileReaderInfo> {let intervalInst:any=null;const fileinfo:FileReaderInfo={fileHeader64:"",tempPath:blobUrl,arrayBuffer:null,base64:"",mime:mimeType,md5:"",};return new Promise<FileReaderInfo>(async (resolve, reject) => {try {const reader = new FileReader();const reader64 = new FileReader();// blob数据转file对象数据const fileBlob: any = await h5_blobURLToBlob(blobUrl);const file = new window.File([fileBlob], 'file.name', { type: mimeType });// 读取file对象ArrayBufferreader.readAsArrayBuffer(file);reader64.readAsDataURL(file);reader.onload = function (e) {const data:any=e?.target?.result;// let spark = new SparkMD5(); // 创建md5对象(基于SparkMD5)let spark = new SparkMD5.ArrayBuffer();spark.append(data);fileinfo.md5=spark.end();fileinfo.arrayBuffer=data;};reader64.onload = function (e) {fileinfo.base64=(e?.target?.result+"");let subPosIdx = (fileinfo.base64 + "").indexOf(",");let headerContent = fileinfo.base64.substr(subPosIdx + 1, 160);fileinfo.fileHeader64=headerContent;};intervalInst=setInterval(()=>{if(fileinfo.base64&&fileinfo.arrayBuffer){clearInterval(intervalInst);resolve(fileinfo);}},100);} catch (e) {if(intervalInst){clearInterval(intervalInst);}reject(e)}})
}
// #endif// #ifdef APP-PLUS
// 通过plus.io读取文件的ArrayBuffer数据
function H5PlusReadFile  (filePath:string,mimeType:string) :Promise<FileReaderInfo> {const fileinfo:FileReaderInfo={fileHeader64:"",tempPath:filePath,arrayBuffer:null,base64:"",mime:mimeType,md5:"",};return new Promise<FileReaderInfo>((resolve, reject) => {try {plus.io.resolveLocalFileSystemURL(filePath,function (entry:any) {entry?.file(function (file:any) {const fileReader = new plus.io.FileReader();fileReader.readAsDataURL(file, 'utf-8');fileReader.onloadend = function (evt:any) {fileinfo.base64=(evt?.target?.result+"");let subPosIdx = (fileinfo.base64 + "").indexOf(",");let headerContent = fileinfo.base64.substr(subPosIdx + 1, 160);fileinfo.fileHeader64=headerContent;const result = {base64: evt.target.result.split(',')[1],size: file.size,};const data:any=uni.base64ToArrayBuffer(result.base64);// let spark = new SparkMD5(); // 创建md5对象(基于SparkMD5)let spark = new SparkMD5.ArrayBuffer();spark.append(data);fileinfo.md5=spark.end();fileinfo.arrayBuffer=data;resolve(fileinfo);}})},function (error) {reject(error)},)} catch (error) {reject(error)}})
}
// #endiffunction MpReadFile(filePath:string,mimeType:string) :Promise<FileReaderInfo>{const fileinfo:FileReaderInfo={fileHeader64:"",tempPath:filePath,arrayBuffer:null,base64:"",mime:mimeType,md5:"",};return new Promise<FileReaderInfo>((resolve, reject) => {if (uni.canIUse('getFileSystemManager') && uni.getFileSystemManager) {}else{fileinfo.errMsg="无效环境,不可调用api!";reject(fileinfo);return ;}const fs = uni.getFileSystemManager();const data:any = fs.readFileSync(filePath);// let spark = new SparkMD5(); // 创建md5对象(基于SparkMD5)let spark = new SparkMD5.ArrayBuffer();spark.append(data);fileinfo.md5=spark.end();fileinfo.arrayBuffer=data;fs.readFile({// 【重点来啦】人家自提供的转码APIfilePath: filePath,// 所需转码图像路径encoding: "base64",// 转码类型success: (res) => {// 生成base64// let imageBase64 = 'data:image/' + image.type + ';base64,' + res.data;let imageBase64 = res.data;console.log('转base64后:', imageBase64);fileinfo.base64=(imageBase64+"");let subPosIdx = (fileinfo.base64 + "").indexOf(",");let headerContent = fileinfo.base64.substr(subPosIdx + 1, 160);fileinfo.fileHeader64=headerContent;resolve(fileinfo);}});});
}// 对外暴露的方法,通过这个方法获取文件的ArrayBuffer,内部会根据平台调用不同的方法
export const readFileDataExt = async (filePath:string,mimeType:string) : Promise<FileReaderInfo> => {if (uni.canIUse('getFileSystemManager') && uni.getFileSystemManager) {return MpReadFile(filePath,mimeType);}// #ifdef APP-PLUSelse if (plus.io) {return H5PlusReadFile(filePath,mimeType);}// #endif// #ifdef H5else if (XMLHttpRequest) {return H5ReadBlobUrl(filePath,mimeType);}// #endifelse {throw new Error('不支持的平台');}
};

实际运行效果

H5平台

选择图片进行上传:图片的数据如下:

在这里插入图片描述
在这里插入图片描述

ps:文件的md5,不同的文件是一定不同的,如果你获得的md5是一样的—那么就好好检查一下,spark获取md5的时候是不是都是同一个东西了。

其他场景有条件再测试。

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

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

相关文章

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、…

nginx 踩坑 之 mine.types

踩坑记录 在尝试在 mac 上部署静态 doc 项目时&#xff0c;发现样式死活显示不出来&#xff0c;但是在开发环境样式可以正常显示的&#xff0c;打包后使用 nginx 代理却不能正常显示&#xff0c;这让我感到很困惑&#xff0c;我一开始认为是代理地址&#xff0c;或者相对路径配…

【机器学习基础】正则化

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战 欢迎订阅&am…

Dockerfile文件中只指定挂载点会发生什么?

当你在VOLUME指令中只指定容器内的路径&#xff08;挂载点&#xff09;而不指定宿主机的目录时&#xff0c;Docker会为该挂载点自动生成一个匿名卷。这个匿名卷存储在宿主机的某个位置&#xff0c;但这个具体位置是由Docker自动管理的&#xff0c;用户通常不需要关心这个存储位…

主流开发语言和开发环境介绍

主流开发语言和开发环境介绍文章目录 ⭐️ 主流开发语言&#xff1a;2024年2月编程语言排行榜&#xff08;TIOBE前十&#xff09;⭐️ 主流开发语言开发环境介绍1.Python2.C3.C4.Java5.C#6.JavaScript7.SQL8.GO9.Visual Basic10.PHP ⭐️ 主流开发语言&#xff1a;2024年2月编程…

C语言二级易忘易错易混知识点(自用)

1.数组名不能自加。 因为数组名实际上是一个指针&#xff0c;指向数组的第一个元素的地址。数组名在编译器中被视为常量&#xff0c;它的值是固定的&#xff0c;不能改变。 要访问数组的不同元素&#xff0c;应该使用数组名加上偏移量的方式来访问。 2.共用体只有最后一次赋值…

相机图像质量研究(30)常见问题总结:图像处理对成像的影响--重影

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【Unity】管道流动模拟Shader

【Unity】管道流动模拟Shader 抽象模拟管道介质流动的效果&#xff0c;使用顶点片元着色器。可以调整管线光泽&#xff0c;颜色&#xff0c;流动方向&#xff0c;透明度&#xff0c;流动体粗细&#xff0c;流动速度和横断面。 实现效果 Demo效果 Demo下载地址 管线光泽调整 …

LabVIEW声速测定实验数据处理

LabVIEW声速测定实验数据处理 介绍了一个基于LabVIEW的声速测定实验数据处理系统的应用。该系统利用LabVIEW的强大数据处理和分析能力&#xff0c;通过设计友好的用户界面和高效的算法&#xff0c;有效提高了声速测定实验的数据处理效率和准确性。通过这个案例&#xff0c;可以…

Gradle8之下载安装与环境变量配置及国内下资源设置

Gradle8之下载安装与环境变量配置及国内下资源设置 文章目录 Gradle8之下载安装与环境变量配置及国内下资源设置1. Gradle1. 官网2. 关于Gradle1. 构建任何内容2. 自动化一切3. 更快地交付 2. 下载与安装1. 下载2. 环境变量3.本地存储路径4. 查看Gradle版本 3. 配置国内下资源1…

Linux CentOS stream 9 安装docker

在计算机技术中,虑拟化是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。 目前,大多数服务器的容量的利用率不足15%,这导致服务器数量激增以及增加了复杂性。服务…

计算机视觉基础【OpenCV轻松入门】:获取图像的ROI

OpenCV的基础是处理图像&#xff0c;而图像的基础是矩阵。 因此&#xff0c;如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作&#xff0c;从而更好地实现对图像的处理。 ROI&#xff08;Region of Interest&#xff09;是…

centos 7.6安装 Apache HTTP Server 2.4.58

centos 7.6安装 Apache HTTP Server 1、下载Apache HTTP Server 2.4.582、安装Apache HTTP Server 2.4.583、配置Apache HTTP Server 2.4.58 1、下载Apache HTTP Server 2.4.58 Apache HTTP Server is the Number One HTTP Server On The Internet. The Apache HTTP Server Pr…

redis scan命令导致cpu飙升

一.背景 今天下午Redis的cpu占用突然异常升高&#xff0c;一度占用达到了90%&#xff0c;触发了钉钉告警&#xff0c;之后又回到正常水平&#xff0c;跟DBA沟通&#xff0c;他说主要是下面这个语句的问题 SCAN 0 MATCH fastUser:6136* COUNT 10000这个语句的执行时长很短&…

SpringBoot项目如何打包成docker镜像?

将Spring Boot项目打包成Docker镜像的过程可以分为以下几个步骤&#xff1a; 1. 创建Dockerfile 首先&#xff0c;你需要在Spring Boot项目的根目录下创建一个Dockerfile。这个文件包含了Docker镜像构建的所有指令。一个基本的Dockerfile可能看起来像这样&#xff1a; # 使用…

运维的利器--监控--zabbix--第二步:建设--汉化补丁

文章目录 一、环境及需求说明二、安装配置步骤1、安装语言包2、查看安装的中文语言包3、登录zabbix控制台设置语言为简体中文4、刷新系统页面 一、环境及需求说明 环境说明&#xff1a; 操作系统 centos 7.9 zabbix-server版本 5.0 一般情况下&#xff0c;zabbix-server和WE…

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码]

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统…

【洛谷题解】P8627 [蓝桥杯 2015 省 A] 饮料换购

题目链接&#xff1a;[蓝桥杯 2015 省 A] 饮料换购 - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;换购 题意&#xff1a; 分析&#xff1a;一直换购直至瓶盖数<3为只 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int main() {i…

【wu-lazy-cloud-network】Java自动化内网穿透架构整理

项目介绍 wu-lazy-cloud-network 是一款基于&#xff08;wu-framework-parent&#xff09;孵化出的项目&#xff0c;内部使用Lazy ORM操作数据库&#xff0c;主要功能是网络穿透&#xff0c;对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 版本更新 1…

Kotlin基本语法 4 类

1.定义类 package classStudyclass Player {var name:String "jack"get() field.capitalize()set(value) {field value.trim()} }fun main() {val player Player()println(player.name)player.name " asdas "println(player.name)} 2.计算属性与防范…