JavaScript 中,File、Blob、Base64 和 ArrayBuffer 不同的用途和转换方法。

JavaScript 中,File、Blob、Base64 和 ArrayBuffer 不同的用途和转换方法。

  • 图示:
    在这里插入图片描述

    文章目录

      • Blob:
      • File:
      • Base64:
      • Buffer:
      • ArrayBuffer:
      • 常用转换函数
        • base64ToFile
        • dataURLtoBlob
        • binaryToDataURL
        • 导出 csv
        • 导出文件
        • 常用 office 文件对应的 MIME TYPE 和后缀

Blob:

  • 概念:代表不可变的原始数据二进制块,可以是图片、视频等数据。
  • 用途:用于处理二进制数据、文件上传和下载、创建文件对象。
// 创建一个 Blob 对象
const blob = new Blob(["Hello, world!"], { type: "text/plain" });
// 创建对象 URL
const url = URL.createObjectURL(blob);//从 Blob 转换为 File:
const file = new File([blob], "hello.txt", { type: "text/plain", lastModified: new Date() });//从 Blob 转换为 Base64:
const reader = new FileReader();
reader.onloadend = () => {const base64 = reader.result.split(",")[1]; // Remove the data URL prefixconsole.log(base64);
};
reader.readAsDataURL(blob);//从 Blob 转换为 ArrayBuffer:
const reader = new FileReader();
reader.onload = (e) => {const arrayBuffer = e.target.result;console.log(arrayBuffer);
};
reader.readAsArrayBuffer(blob);

File:

  • 概念:File 是 Blob 的子类,代表用户上传的文件对象,包含文件名、文件类型等信息。
  • 用途:用于表示文件对象,通常来自用户输入的文件(如通过 )。
//从 File 转换为 Blob:
const file = document.querySelector('input[type="file"]').files[0];
const blob = new Blob([file], { type: file.type });//从 File 转换为 base64:
const reader = new FileReader();
reader.onload = function (event) {// 获取 Base64 编码的结果const base64String = event.target.result.split(",")[1];console.log(base64String);
};
reader.readAsDataURL(file);//从 File 转换为 ArrayBuffer:
const reader = new FileReader();
reader.onload = (e) => {const arrayBuffer = e.target.result;console.log(arrayBuffer);
};
reader.readAsArrayBuffer(file);

Base64:

  • 概念:一种编码方式,将二进制数据编码为 ASCII 字符串。
  • 用途:用于在 URL 或 HTML 中嵌入小的图像、文件,方便传输,但数据会变得更大。
// 将文本编码为 Base64
const base64 = btoa("Hello, world!");
// 解码 Base64
const decoded = atob(base64);//从 Base64 转换为 Blob:
const base64 = "data:text/plain;base64,SGVsbG8sIHdvcmxkIQ==";
const response = await fetch(base64);
const blob = await response.blob();//从 Base64 转换为 ArrayBuffer:
const base64 = "SGVsbG8sIHdvcmxkIQ==";
const binaryString = atob(base64);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {bytes[i] = binaryString.charCodeAt(i);
}
const arrayBuffer = bytes.buffer;
console.log(arrayBuffer);

Buffer:

  • 概念:在 Node.js 环境中使用的用于处理原始二进制数据的对象。提供了更多用于操作和管理二进制数据的方法,特别适合处理文件系统和网络流数据。
  • 用途:用于处理二进制数据的类,特别适合处理文件、网络流、加密操作等。常用于文件系统操作、网络请求和响应处理等 Node.js 环境中。
  • 特点:
    • 高效:Buffer 在 Node.js 中用于处理二进制数据,提供了高效的内存管理。自身具有丰富的方法来直接操作数据。
    • 方法丰富:提供了很多内置的方法用于操作二进制数据,如 write, slice, toString, fill 等。
    • Node.js 专用:是 Node.js 的核心部分,不直接在浏览器中使用。
// 创建一个 Buffer 对象,包含字符串数据
const buffer = Buffer.from("Hello, world!", "utf-8");// 输出 Buffer 内容
console.log(buffer); // 输出: <Buffer 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21>// 将 Buffer 转换为字符串
console.log(buffer.toString()); // 输出: Hello, world!

ArrayBuffer:

  • 概念:是一个用于表示通用、固定长度的原始二进制数据缓冲区。提供原始的二进制数据缓冲区,通常用于处理和传输数据。
  • 用途:用于 Web 开发中的二进制数据处理,如从 Blob 读取数据、处理 WebSockets 的二进制数据等。
  • 特点:ArrayBuffer 本身是不可变的。它是二进制数据的原始缓冲区,不能直接进行读写操作。
  • 视图: 可以通过不同的视图(TypedArray)(如 Uint8Array, Int16Array, Float32Array 等)来读写 ArrayBuffer 中的数据。
  • Web API:是 Web 标准的一部分,广泛用于 Web 应用程序中、用于浏览器环境。
// 创建一个 16 字节的 ArrayBuffer
const buffer = new ArrayBuffer(16);// 创建一个视图来读取和写入数据
const view = new Uint8Array(buffer);// 设置数据
view[0] = 42;// 读取数据
console.log(view[0]); // 输出: 42//从 ArrayBuffer 转换为 Blob:
const blob = new Blob([arrayBuffer], { type: "application/octet-stream" });//从 ArrayBuffer 转换为 Base64:
const base64 = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
console.log(base64);

常用转换函数

base64ToFile

function base64ToFile(base64String, fileName) {// 从 Base64 字符串中提取 MIME 类型和编码数据const [header, base64Data] = base64String.split(",");const mime = header.match(/:(.*?);/)[1];// 解码 Base64 数据const binaryString = atob(base64Data);const arrayBuffer = new ArrayBuffer(binaryString.length);const uint8Array = new Uint8Array(arrayBuffer);// 将解码的数据填充到 Uint8Array 中for (let i = 0; i < binaryString.length; i++) {uint8Array[i] = binaryString.charCodeAt(i);}// 创建 Blob 对象const blob = new Blob([uint8Array], { type: mime });// 创建 File 对象return new File([blob], fileName, { type: mime });
}

dataURLtoBlob

/*** base64编码的dataURL转化为Blob不可变二进制数据* @param {String} dataURL base64编码的dataURL字符串,格式比如 data:image/png;base64,经过base64编码的字符串* @result {Object} 返回值为Blob对象*/
export function dataURLtoBlob(dataURL) {//获取MIME类型let mime = dataURL.split(",")[0].split(":")[1].split(";")[0];//对经过base64编码的数据进行解码let byteString = window.atob(dataURL.split(",")[1]);// 创建内存let arrayBuffer = new ArrayBuffer(byteString.length);// 生成内存的视图,通过TypeArray对象操作二进制let typeArray = new Uint8Array(arrayBuffer);// 遍历二进制数据通过typeArray对象将数据存储到arrayBuffer对象中for (let i = 0; i < byteString.length; i++) {typeArray[i] = byteString.charCodeAt(i);}// 生成blob数据return new Blob([typeArray], { type: mime });
}

binaryToDataURL

/*** 将binary(二进制)数据转化为base64编码的DataURL字符串* @param {Object} data Blob类型或file类型的数据* @param {Function} fn 回调函数*/
export function binaryToDataURL(data, fn) {if (window.FileReader) {const file = new FileReader();//如果data为空返回nullif (data == undefined) return fn(null);file.onload = function (e) {fn(e.target.result);};file.readAsDataURL(data);}
}

导出 csv

/*** 前端导出csv格式表格(没有表格线),但是不支持合并表格和图片导出,并且解决了csv文件过大下载失败的问题* @param {String} str 标题字符串,格式: '标题1,标题2,标题3...'* @param {array} dataList 数据数组, 格式: [{},{},{}...]* @param {String} fileName 保存文件名*/
export function exportCSV(str, dataList, fileName) {fileName = fileName || new Date().getTime();//标题str = str + "\n";//增加\t为了不让表格显示科学计数法或者其他格式for (let i = 0; i < dataList.length; i++) {for (let item in dataList[i]) {str += `${dataList[i][item] + "\t"},`;}str += "\n";}//在字符串前面添加\ufeff解决构造Blob中文乱码问题str = "\ufeff" + str;//构造Blob数据(text/plain纯文本格式)let blob = new Blob([str], { type: "text/plain;charset=utf-8" });//创建url和下载标签let url = window.URL.createObjectURL(blob);let link = document.createElement("a");link.href = url;link.download = fileName + ".csv";document.body.appendChild(link);link.click();document.body.removeChild(link);//释放url对象window.URL.revokeObjectURL(url);
}

导出文件

/*** 下载二进制数据(ajax请求需设置responseType: "blob"或"arraybuffer")* @param {Blob} data 二进制数据 必填* @param {string} fileName 文件名称 必填* @param {string} type 文件后缀 必填*/
export function saveAsBinary(data, fileName, type) {if (!fileName || !type) {console.error("please set file name and file type");}// 转换成blob数据let blob = null;if (isBlob(data)) {blob = data;} else if (isArrayBuffer(data)) {blob = new Blob([data], { type: FileAndMIME[type] });} else {return;}// ie浏览器兼容if (window.navigator.msSaveOrOpenBlob) {navigator.msSaveBlob(blob, `${fileName}.${type}`);} else if (window.URL) {//创建a标签const link = document.createElement("a");//获取body元素const body = document.querySelector("body");//创建url链接link.href = window.URL.createObjectURL(blob);//重命名link.download = `${fileName}.${type}`;//火狐需要隐藏标签link.style.display = "none";//插入到body中body.appendChild(link);//触发下载link.click();//移除a标签body.removeChild(link);//释放url对象window.URL.revokeObjectURL(link.href);}
}

常用 office 文件对应的 MIME TYPE 和后缀

export const FileAndMIME = {".doc": "application/msword",".dot": "application/msword",".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",".docm": "application/vnd.ms-word.document.macroEnabled.12",".dotm": "application/vnd.ms-word.template.macroEnabled.12",".xls": "application/vnd.ms-excel",".xlt": "application/vnd.ms-excel",".xla": "application/vnd.ms-excel",".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12",".xltm": "application/vnd.ms-excel.template.macroEnabled.12",".xlam": "application/vnd.ms-excel.addin.macroEnabled.12",".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12",".ppt": "application/vnd.ms-powerpoint",".pot": "application/vnd.ms-powerpoint",".pps": "application/vnd.ms-powerpoint",".ppa": "application/vnd.ms-powerpoint",".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12",".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12",".potm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12",".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
};

总结

  • File 和 Blob 用于处理文件和二进制数据。
  • Base64 用于编码和嵌入二进制数据。适合小量数据嵌入。
  • ArrayBuffer 用于处理原始二进制数据缓冲区。
  • Buffer 主要用于 Node.js 环境处理原始数据。

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

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

相关文章

万维网服务器工作

万维网服务器&#xff08;WWW服务器&#xff09;的工作方式主要基于客户机/服务器&#xff08;Client/Server&#xff09;模式&#xff0c;通过HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;等协议与客户端&#xff08;如网页浏览器&…

U盘不小心格式化了怎么恢复?别慌!教你快速恢复

在日常工作和生活中&#xff0c;U盘已成为我们存储和传输数据的重要工具。然而&#xff0c;有时由于误操作或其他原因&#xff0c;我们可能会不小心格式化U盘&#xff0c;导致重要数据的丢失。这时&#xff0c;如何恢复这些数据就显得尤为重要。下面&#xff0c;我们将介绍几种…

黑神话悟空·幽魂怎么打?超爽攻略!

在正式打法之前&#xff0c;这里推荐一款巨好用的开放式耳机&#xff0c;能够让我们的游戏更加的畅快&#xff01; 有条件的也建议使用南卡OE MIX这款开放式耳机&#xff0c;也非常适合在游戏时使用&#xff0c;不入耳的设计避免了长时间游戏佩戴可能带来的耳道不适和耳朵胀痛…

二进制方式安装K8S

⼀、安装说明 本⽂章将演示Rocky 8 ⼆进制⽅式安装⾼可⽤k8s 1.28.0版本。 ⽣产环境中&#xff0c;建议使⽤⼩版本⼤于5的Kubernetes版本&#xff0c;⽐如1.19.5 以后的才可⽤于⽣产环境。 ⼆、集群安装 2.1 基本环境配置 请统⼀替换这些⽹段&#xff0c;Pod⽹段和service和…

Azure AI Search 中的二进制量化:优化存储和加快搜索速度

随着组织继续利用生成式 AI 的强大功能来构建检索增强生成 (RAG) 应用程序和代理&#xff0c;对高效、高性能和可扩展解决方案的需求从未如此强烈。 今天&#xff0c;我们很高兴推出二进制量化&#xff0c;这项新功能可将向量大小减少高达 96%&#xff0c;同时将搜索延迟减少高…

Echarts 绘制地图省、市、区、县(以及点击显示下级,支持坐标定位)

** Echarts 绘制地图省、市、区、县&#xff08;以及点击显示下级&#xff0c;支持坐标定位&#xff09; ** 上代码 <template><div class"mapCont"><div id"mapSelf" contextmenu.prevent"disableContextMenu"></div&g…

Git学习尚硅谷(002 git常用命令)

尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 总时长 4:52:00 共45P 此文章包含第8p-第p15的内容 文章目录 git常用命令设置用户签名初始化本地库查看本地库状态添加暂存区提交本地库日志查看修改文件版本穿梭 git常用命令 设置用户签名…

数据结构:(LeetCode 965)相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

开发手札:关于项目管理中开发工作安排的问题

最近工作越来越偏向管理方向了&#xff08;兼吗喽&#xff09;&#xff0c;所以仔细思考了一下给开发工作安排的问题。 结合自己开发过程中的体会&#xff0c;我觉得在构建完成用户需求文档的同时。 再站在开发的角度&#xff0c;构建一份详细的模块构架设计图就更…

STM32 HAL CAN (TJA1050CAN模块) 通讯(一)理论

1、简介 CAN具备多个设备交互的能力,但是网上大多是两个单片机进行交互,或者单片机通过CAN收发器与上位机进行交互测试,本次通过STM32cubeMX完成CAN通讯配置,并通过多个单片机进行数据交互测试。 2、CAN简介 CAN是一种串行通讯协议,主要有低速、高速CAN两种。 低速CAN…

亚马逊测评深度解析:如何安全高效提升产品销量和好评

在亚马逊这一全球电商巨擘的舞台上&#xff0c;产品测评不仅是消费者决策的重要依据&#xff0c;更是商家提升产品曝光、促进销售转化的核心驱动力。然而&#xff0c;随着平台监管力度的加强和市场竞争的日益激烈&#xff0c;如何在遵守规则的前提下&#xff0c;安全有效地进行…

相亲交友小程序开发功能分析

相亲交友小程序的开发功能分析可以从用户端和管理后台两个主要方面来进行。 用户端功能 注册与登录&#xff1a; 用户可以通过手机号、微信号或其他第三方平台进行注册登录&#xff0c;简化注册流程。 实名认证&#xff1a; 引入实名认证机制&#xff0c;确保用户信息的真实…

上传本地项目到git上面

文章目录 1.服务器创建一个空项目1.1.创建项目1.2.界面可能不一样 2.上传新项目到git上面2.1.将远程项目拉取到本地进行上传1. 将项目克隆到本地&#xff1a;&#xff08;为了建立本地仓库和远程仓库关系方便推送&#xff09;2. 建立本地仓库和远程仓库关系并推送&#xff08;如…

基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 长短期记忆网络&#xff08;LSTM&#xff09; 4.3 BO-CNN-LSTM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) B…

解锁MySQL数据库基础命令:从入门到精通的实战指南

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

亿发进销存一体化解决方案:多终端无缝协同,赋能企业全业务-上

亿发软件凭借对产品、市场、业务的深入理解&#xff0c;在进销存基础上进行了延伸&#xff0c;推出多终端、一体化的“进销存管理系统”多元产品矩阵。在技术上实现电脑端、手机端、PDA端、零售端、商家版以及小程序商城的多终端无缝对接。各个端口间的数据可以互通互联&#x…

未来十年美业发展方向:健康与美容的结合|美业SaaS系统收银系统源码

随着人们对健康和美容的重视不断增加&#xff0c;美业正在经历一场革命性的变革。未来&#xff0c;美业的发展将更加注重健康与美容的结合&#xff0c;这一趋势将在多个领域产生深远影响。 下面博弈美业为大家阐释「为什么未来美业的发展方向是健康和美容的结合」&#xff1a;…

STM32(F103ZET6)第十九课:FreeRtos的移植和使用

目录 需求一、FreeRtos简介二、移植FreeRtos1.复制代码2.内存空间分配和内核相关接口3.FreeRtosConfig4.添加到工程中三、任务块操作1.任务四种状态2.创建任务过程 需求 1.将FreeRtos&#xff08;嵌入式实时操作系统&#xff09;移植到STM32中。 2.在该系统中实现任务的创建、…

Elasticsearch集群工作原理

简介 ELasticsearch作为一个分布式搜索引擎&#xff0c;能够出色地支持集群模式、动态水平扩容、故障转移等分布式系统特性&#xff0c;这是其作为全文搜索引擎首选的重要原因。 本文从零开始描述集群的配置和扩容过程&#xff0c;让你对Elasticsearch集群的工作原理有初步的…

mmdetection学习——模型对比实验

1. 安装配置mmdetection环境&#xff0c;直接看官网 开始你的第一步 — MMDetection 3.0.0 文档 最好用conda新建环境管理&#xff0c;防止包冲突 git clone mmdetection源码到本地 2. 开始实验 2.1 准备数据集 需要使用COCO数据集格式 2.2 配置训练文件 在configs文件夹…