谈谈:File、Blob、FileReader、ArrayBuffer、base64

news/2024/11/17 20:18:13/

JavaScript 提供了一些 API 来处理文件或原始文件数据,例如:File、Blob、FileReader、ArrayBuffer、base64 等。下面就来看看它们都是如何使用的,它们之间又有何区别和联系。

1. Blob

Blob全称为binary large Object 即二进制大对象,他是js中的一个对象,表示原始类似文件的数据。MDN中的解释:

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

Blob 表示的不一定是 JavaScript 原生格式的数据。

(1)可以使用Blob()创建一个blob:
new Blob(array, options);

 其中两个参数:

  • array :可以是ArrayBuffer、ArrayBufferView、Blob、DOMString等对象构成的,将会被放进BLob;
  • option :可选的BlobPropertyBag字典。

 

 const obj = { hello: "world" };const blob = new Blob([JSON.stringify(obj, null, 2)], {type: "application/json",});console.log("blob", blob);

 URL.createObjectURL()  将Blob对象转为url地址

2. FIle

 File 接口基于 Blob,继承了 blob 的功能并将其扩展以支持用户系统上的文件。

 File 对象是特殊类型的 Blob,且可以用在任意的 Blob 类型的 context 中。比如说, FileReader, URL.createObjectURL(), createImageBitmap() (en-US), 及 XMLHttpRequest.send() 都能处理 Blob 和 File

3.FileReader

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

// FileReader && Blob/File转化
// FileReader 对象允许web应用程序异步读取存储在用户计算机上的文件内容
export const readBlob = (blob, type) => {return new Promise((resolve) => {let reader = new FileReader();reader.onload = (event) => {resolve(event.target.result);};switch (type) {case "ArrayBuffer":// 生成ArrayBUfferreader.readAsArrayBuffer(blob);break;case "DataUrl":// 生成base64reader.readAsDataURL(blob);break;case "Text":reader.readAsText(blob, "utf-8");break;default:break;}});
};

4.base64

Base64 是一种基于64个可打印字符来表示二进制数据的表示方法。Base64 编码普遍应用于需要通过被设计为处理文本数据的媒介上储存和传输二进制数据而需要编码该二进制数据的场景。这样是为了保证数据的完整并且不用在传输过程中修改这些数据。

在 JavaScript 中,有两个函数被分别用来处理解码和编码 base64 字符串:

  • atob():解码,解码一个 Base64 字符串;
  • btoa():编码,从一个字符串或者二进制数据编码一个 Base64 字符串。
btoa("JavaScript")       // 'SmF2YVNjcmlwdA=='
atob('SmF2YVNjcmlwdA==') // 'JavaScript'

 也可以利用canvas画布中的toDataURL生成base64.

 /*** @param url 图片路径*/function getUrlBase64(url) {return new Promise((resolve, reject) => {let canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");let img = new Image();img.crossOrigin = "Anonymous"; //开启img的“跨域”模式img.src = url;img.onload = function() {canvas.height = img.height;canvas.width = img.width;ctx.drawImage(img, 0, 0, img.width, img.height); //参数可自定义const dataURL = canvas.toDataURL("image/jpeg",1); //获取Base64编码resolve(dataURL);canvas = null; //清除canvas元素img = null; //清除img元素};img.onerror = function() {reject(new Error("Could not load image at " + url));};});}

也可以使用FileReader.

// FileReader && Blob/File转化
// FileReader 对象允许web应用程序异步读取存储在用户计算机上的文件内容
export const readBlob = (blob, type) => {return new Promise((resolve) => {let reader = new FileReader();reader.onload = (event) => {resolve(event.target.result);};switch (type) {case "ArrayBuffer":// 生成ArrayBUfferreader.readAsArrayBuffer(blob);break;case "DataUrl":// 生成base64reader.readAsDataURL(blob);break;case "Text":reader.readAsText(blob, "utf-8");break;default:break;}});
};

base64 转 blob

// 将base64转为blob
export function base64toBlob(base64) {let bstr = window.atob(base64), // 获得base64解码后的字符串n = bstr.length,u8arr = new Uint8Array(n); // 新建一个8位的整数类型数组,用来存放ASCII编码的字符串while (n--) {u8arr[n] = bstr.charCodeAt(n); // 转换编码后才使用charCodeAt 找到Unicode编码}const fileStream = new Blob([u8arr], { type: "text/plain" });const url = URL.createObjectURL(fileStream);return url;
}

5.ArrayBuffer

ArrayBuffer对象用来表示通用的、固定长度的原始二进制数据缓冲区。他是一个字节数组,通常在其他语言中称为“byte array”。你不用直接操作ArrayBuffer中的内容;而是通过类型化数组对象或DataView对象来操作,他们会将缓冲区中的数据表示为特定的格式,并通过这些读写缓冲区的内容。

// FileReader && Blob/File转化
// FileReader 对象允许web应用程序异步读取存储在用户计算机上的文件内容
export const readBlob = (blob, type) => {return new Promise((resolve) => {let reader = new FileReader();reader.onload = (event) => {resolve(event.target.result);};switch (type) {case "ArrayBuffer":// 生成ArrayBUfferreader.readAsArrayBuffer(blob);break;case "DataUrl":// 生成base64reader.readAsDataURL(blob);break;case "Text":reader.readAsText(blob, "utf-8");break;default:break;}});
};


http://www.ppmy.cn/news/472303.html

相关文章

怎么查自己电脑服务器信息吗,如何查看自己电脑的服务器

如何查看自己电脑的服务器 点我的电脑右键点属性,再点机名。上有显示完整的。 是IP的话,始,再点运行,再输入CMD,再输入ipconfig就可以看到自己电脑的IP了。 电脑服务器是一种高性能计算机,作为网络的节点&a…

金蝶系统怎样查看服务器地址,怎样查看金蝶服务器地址

怎样查看金蝶服务器地址 内容精选 换一换 在用户管理界面上,查看裸金属服务器的IP地址。 通过Web浏览器登录云堡垒机系统,上报您的IP地址不在允许登录的范围内!错误。通过Web浏览器登录云堡垒机系统,上报您的MAC地址不在允许登录的范围内!错误。云堡垒机系统限制了用户IP地…

网工内推 | 金融业网工专场,员工旅游,带薪年假,节日福利

01 银信科技 招聘岗位:网络工程师 职责描述: 1) 负责分支机构筹建网络系统调试与部署工作、网络运维管理及问题处理支持; 2) 处理外部代理点系统及网络问题协助支持; 3) 负责网络日志平台监控及…

创乐博相机和迈德威视工业相机调参记录

一、创乐博相机 相机类型 : 创乐博 调参数据对象:宽度(Width),高度(Height),色调(Hue)、饱和度(Saturation)、明度(Value)、对比度(Contrast)、帧率&#xf…

vscode有哪些移动方法?

按照单词移动光标 在 Visual Studio Code (VS Code) 中,你可以使用以下快捷键来按单词移动光标: 在 Windows 和 Linux 系统上,按 Ctrl Left Arrow 或 Ctrl Right Arrow 可以使光标向左或向右移动一个单词。在 macOS 系统上,按…

利用投影提升ClickHouse查询性能

ClickHouse中表排序键对与查询性能至关重要。本文介绍当使用非排序键作为查询条件时如何提升查询性能。通过对非排序键定义投影,然后物化排序结果,利用空间换时间策略,提升查询性能。 选择ClickHouse排序键的规则 当创建MergeTree表时&#…

该如何快速创建一个成绩查询系统?

作为一名教师,我们经常需要查询学生的成绩,以便更好地评估他们的学习进度和制定更好的教学计划。然而,传统的手工查询成绩的方式非常耗时且容易出错。随着技术的发展和普及,我们可以通过快速创建一个成绩查询系统来更好地管理和查…

计算机专业实训图片,实训一图片的简单处理_计算机软件及应用_IT计算机_专业资料...

实训一图片的简单处理_计算机软件及应用_IT计算机_专业资料 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 一、Photoshop CS的界面组成Photoshop CS的界面主要由标题栏、菜单栏、属…