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

news2024/10/7 12:28:31

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":
        // 生成ArrayBUffer
        reader.readAsArrayBuffer(blob);
        break;
      case "DataUrl":
        // 生成base64
        reader.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":
        // 生成ArrayBUffer
        reader.readAsArrayBuffer(blob);
        break;
      case "DataUrl":
        // 生成base64
        reader.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":
        // 生成ArrayBUffer
        reader.readAsArrayBuffer(blob);
        break;
      case "DataUrl":
        // 生成base64
        reader.readAsDataURL(blob);
        break;
      case "Text":
        reader.readAsText(blob, "utf-8");
        break;
      default:
        break;
    }
  });
};

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

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

相关文章

嵌入式软件开发工程师具体可以分三类

嵌入式软件开发工程师可以根据其职责和专长分为以下三类:底层固件开发工程师:底层固件开发工程师负责编写和优化嵌入式系统的底层软件,与硬件密切相关。他们通常需要熟悉处理器架构、寄存器级编程、中断处理、设备驱动程序和实时操作系统&…

Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版

一、Oracle21C PLSQL Developer 15 Oracle客户端文件下载 1、Oracl21C下载地址:https://www.oracle.com/cn/database/technologies/oracle-database-software-downloads.html 2、 PLSQL Developer 15下载地址:https://www.allroundautomations.com/re…

微信支付(JSAPI支付)/支付宝支付(手机网站支付)实现思路及实现方案-无源码

背景 停车系统 一个二维码同时支持微信及支付宝扫码付款,使用手机网站实现 临时车费用缴费二维码需要通知支持微信及支付宝。用户缴纳的停车费直接到各个商户的账户上,不经过停车系统开发公司。 方案 微信:使用微信服务商提供的服务支付…

【twcc】学习2:cc-feedback包送去cc预估码率

继续学习1,学习1中是准备知识,实际操练是在本文的预估中。 主要是对照大神的神作第八章 学习。 大量引用了大神的内容。 学习1中,大神主要论述了发送侧如何构造cc-fb,等待收到rtcp-cc-fb后进行再更新,然后最终交给cc模块。 这是大神绘制的图片,总结的非常清晰到位: 大神…

归一化详细推导

1. 一组数减去平均数的差的和为0。 一组数:a1,a2,a3,……,an, 平均数:a=(a1+a2+……+an)/n, 则 a1+a2+……+an=n*a, 从而,每一个数减去平均数的差的和为 (a1-a)+(a2-a)+……+(an-a) =(a1+a2+……+an)-n*a =0 2. 设原始数据均值及标准差为,将原始数组经过变换后得到使得均…

保护您的网站免受黑客攻击的七个良好习惯

世界上通常有三种类型的网站/APP拥有者:第一种是一直具备较高风险意识的人、第二种是非常自信认为没有任何东西可以攻击和破坏他们网站的人,第三种:根本不关心它的人。 第二种远比另外两种人更容易感受后悔和痛苦。实际上,黑客攻…

autocad中的快文件

一、块的定义 图块也称块,它是由一组图形对象组成的集合,一组对象一旦被定义为图块,它们将成 为一个整体,选中图块中任意一个图形对象即可选中构成图块的所有对象。AutoCAD 把一个 图块作为一个对象进行编辑修改等操作&…

docker常用基本命令及安装

docker常用基本命令及安装 1. docker启动等命令2. 常用基本操作命令3. 删除镜像3.1 步骤如下:3.2 可能会出现的问题 4. 宿主机与容器之间拷贝文件5. 关于docker的安装5.1 安装5.2 解决拉取镜像失败(超时)——配置 docker 镜像加速 1. docker启…

有什么好用的mp3转wav软件?分享这几个方法!

无论是在日常生活还是工作中,我们经常需要进行音频格式转换,如将MP3转换为WAV。通常情况下,为了解决这个问题,我们需要依赖专业的音频转换工具。下面介绍三款非常好用的音频转换软件,供参考: 一、记灵在线…

Git(1)

文章目录 1. 初始 Git2. 安装 Git3. 创建仓库4. 新增配置项5. 认识 Git 工作区 , 缓存区 , 版本库6. 添加文件7. 查看 .git 文件8. 修改文件9. 版本回退10. 撤销修改11 . 总结 1. 初始 Git 提出问题 : 图一 : 图二 : 图三 : 2. 安装 Git 3. 创建仓库 只…

一个资深测试工程师面试一来就问我这些题目

作为一个已经工作有10年经验的测试工程师,其间也辗转了几个大的互联网公司,虽然确实缺少了一些稳定性,但同时也积累了一些面试的经验,不才分享一些给大家。那么主要是针对测试工程师的一些总结,对于其他的工种&#xf…

9.Sentinel控制台 配置 nacos持久化

一、Sentinel 持久化机制 推送模式说明优点缺点原始模式API将规则推送至客户端并直接更新到内存中,扩展写数据源简单、无任何依赖不保证一致性;规则保存在内存中,重启不建议用于生产环境PULL模式客户端主动向某个规则管理中心定期轮询拉取规则,<br />这个规则中心可以…

Python面向对象编程1-面向过程的简单纸牌游戏程序 项目1.5 抽两张牌比较大小

总项目目标&#xff1a;用面向过程思想设计一个简单的纸牌游戏程序&#xff0c;称为"Higher or Lower"&#xff08;高还是低&#xff09;。游戏中&#xff0c;玩家需要猜测接下来的一张牌是比当前牌高还是低。根据猜测的准确性&#xff0c;玩家可以得到或失去相应的积…

elementui el-image组件 点击预览图片

效果&#xff1a;点击单个图片&#xff0c;查看大图 <template><el-container class"platform-list-page"><el-main class"stationList"><data-tableref"DataTable":default-show-type"defaultShowType":default…

Axure教程—对称对比图(中继器)

本文将教大家如何用AXURE中的中继器制作对称对比图 一、效果 预览地址&#xff1a;https://c517td.axshare.com 二、功能 修改中继器的数据&#xff0c;可自动生成对比图 三、制作 1、中继器 拖入一个中继器&#xff0c;并对其赋值&#xff0c;如图&#xff1a; 2、中继器内部…

web前端Tips:断点续传如何实现?

在Web前端中实现断点续传功能的一种常见方式是使用HTTP Range请求和文件分片上传。 以下是一个简单的断点续传实现的步骤&#xff1a; 前端将要上传的文件分成多个固定大小的片段&#xff08;chunk&#xff09;&#xff0c;例如每个片段的大小为1MB。当用户选择上传文件时&am…

【C/C++数据结构与算法】C语言扫雷游戏

目录 项目分析 外部头文件 初始化 打印 扫雷游戏函数 main函数 项目分析 游戏需要自定义地图的大小、埋雷的数量通过输入坐标进行扫雷&#xff0c;输入的坐标是埋雷的地方&#xff0c;则游戏失败输入的坐标未埋雷&#xff0c;则该坐标显示周围8个坐标总共的雷数游戏初始…

Redis入门指南:面向测试工程师

现在测试工程师面试难度越来越大&#xff0c;关于技术方面考察&#xff0c;很多面试官经常会问你是否了解过Redis缓存中间件&#xff0c;这道题一方面是考察你是否对后端技术有一定了解&#xff0c;另一方面也考察你测试工作的深浅。 所以本文将由浅到深、由易到难列举Redis相…

亿发软件:智慧中医馆一体化系统解决方案,实现中医药煎配信息化

近年来&#xff0c;随着中药制造领域先进技术的大力推广和应用&#xff0c;先进制造技术的融合对关键工艺和装备进行了革新。传感器、过程检测技术、自动化设备和信息管理系统的采用显著提高了中药汤剂的生产。下面我们来探讨一下中药煎配信息化管理系统&#xff1a;中药生产过…

photoshop beta正在面临高峰 用不了报错的解决方法

作为一款非常实用的修图软件&#xff0c;photoshop beta是很多正在工作的白领都会使用的&#xff0c;我们可以在其中完成图片的制作&#xff0c;方便又快捷&#xff0c;为大家的工作提供了更多便捷的服务。不过最近也有部分用户在使用这个软件的时候出现了正在面临高峰的报错&a…