base64、File、Blob、ArrayBuffer几种文件格式介绍以及互转

news2025/4/9 2:21:40

文章目录

      • 关系
      • 介绍
        • Blob
        • File
        • FileReader
        • 二进制数组
        • ArrayBuffer对象
        • URL.createObjectURL
        • base64
      • 转化
        • file转base64
        • blob转base64
        • base64转blob
        • baes64转file
        • blob转file
        • blob转ArrayBuffer
        • file转ArrayBuffer

关系

在这里插入图片描述

介绍

Blob

在这里插入图片描述

  1. 介绍

    1. 是一个不可变、原始数据的类文件对象
    2. 本质上是js的对象
      1. size:包含的数据大小(字节)
      2. type:包含的数据的MIME类型
    3. 里面存储的是二进制数据
    4. 可以使用FileReader来读取blob中的内容
  2. 创建

    // 语法
    const blob = new Blob(array, options);
    
    // 示例
    const blob = new Blob([JSON.stringify(debug, null, 2)],   {type : 'application/json'});
    const myBlob = new Blob([1,2,3],{type:'text/plain'});
    console.log(myBlob);//Blob {size: 3, type: "text/plain"}
    console.log(myBlob.size);//3
    console.log(myBlob.type);//'text/plain'
    
    

File

在这里插入图片描述

  1. 介绍

    1. File对象是特殊的Blob
    2. 实例化有3个参数:new File(array, name, options)
    3. 一般通过上传获取File对象
      1. 通过input type=file选择文件,返回fileList对象
      2. 拖拽文件生成DataTransfer对象
  2. 创建

    const file = new File([file], file.name, {type: file.type});
    
    // input上传
    <input type="file" id="file">
    <script>
        let obj = document.querySelector('#file')
        obj.addEventListener('change', (event) => {
            console.log(event.target.files[0]);
        })
    </script>
    
    // 拖拽
    <div class="drop" style="background-color: pink; height: 50px;"></div>
    <script>
        let obj = document.querySelector('.drop')
        obj.ondragover = e => {e.preventDefault()}
        obj.ondrop = e => {
            e.preventDefault()
            console.log(e.dataTransfer.files);
        }
    </script>
    

FileReader

是js的内置方法,帮助实现读取File/Blob的对象内容

readAsArrayBuffer(file) 异步按字节读取文件内容,完成之后,result属性中保存被读文件的ArrayBuffer数据对象。
readAsBinaryString(file): 异步按字节读取文件内容,结果为文件的二进制串
readAsDataURL(file) 异步读取文件内容,结果用data:url的字符串形式表示。
readAsText(file) 异步按字符读取文件内容,result中包含的是字符串。
onabort 当读取操作被中止时调用
onerror 当读取操作发生错误时调用
onload 当读取操作成功完成时调用
onloadend 当读取操作完成时调用,不管是成功还是失败
onloadstart 当读取操作将要开始之前调用
onprogress 在读取数据过程中周期性调用

二进制数组

  1. ArrayBuffer对象TypedArray视图DataView视图是 JavaScript 操作二进制数据的一个接口
  2. 它们都是以数组的语法处理二进制数据,所以统称为二进制数组
  3. 二进制数组并不是真正的数组,而是类似数组的对象

它由三类对象组成

  1. ArrayBuffer对象

    代表内存之中的一段二进制数据,可以通过“视图”进行操作。“视图”部署了数组接口,这意味着,可以用数组的方法操作内存。

  2. TypedArray视图

    共包括 9 种类型的视图,比如Uint8Array(无符号 8 位整数)数组视图, Int16Array(16 位整数)数组视图, Float32Array(32 位浮点数)数组视图等等。

  3. DataView视图

    可以自定义复合格式的视图,比如第一个字节是 Uint8(无符号 8 位整数)、第二、三个字节是 Int16(16 位整数)、第四个字节开始是 Float32(32 位浮点数)等等,此外还可以自定义字节序。

ArrayBuffer对象

ArrayBuffer不是能直接读取所存储的内容,需要借助TypedArray对象或DataView对象来读写

URL.createObjectURL

  1. 会根据传入的参数创建一个指向该参数对象的URL
  2. 这个URL的生命周期存在于他被创建的这个文档里
  3. 一般涌来在浏览器中预览图片、音频、视频等二进制数据,无需上传至服务器

用法

<!DOCTYPE html>
<html>
  <head>
    <title>Upload Image</title>
  </head>
  <body>
    <input type="file" name="imgFile" id="imgFile" onchange="changeFile()" />
    <br />
    <img id="previewImg" src="" alt="Preview Image" />
    <script>
      function changeFile() {
        const imgFile = document.getElementById('imgFile').files[0]; // 接口需要的参数 file类型的图片
        console.log(imgFile.size);
        if (imgFile.size > 1024 * 1024 * 2) return alert('不允许超过 2 M');
        const typeArr = ['image/png', 'image/jpeg', 'image/git', 'image/jpg'];
        if (!typeArr.includes(imgFile.type)) return alert('只支持jpg,png,jpeg,gif格式');
        // 生成预览图片地址:通过js将文件信息在本地电脑内存中变成一个预览地址临时拿去使用显示
        const imgUrl = URL.createObjectURL(imgFile);
        console.log(imgUrl); // blob:null/a0972036-a4b0-4821-9a0e-b2003797cb3d
        document.getElementById('previewImg').src = imgUrl;
      }
    </script>
  </body>
</html>

base64

在这里插入图片描述

  1. 介绍

    1. 是一个基于64个可打印字符来表示二进制数据的表示方法
    2. 应用于需要通过被设计为文本数据媒介进行上传储存和传输二进制数据,从而编码
  2. 转化方法(js)

    1. atob():解码
    2. btoa():编码
  3. 实际应用场景

    1. 将canvas转为base64编码格式图片

      const canvas = document.getElementById('canvas'); 
      const ctx = canvas.getContext("2d");
      const dataUrl = canvas.toDataURL();
      
    2. 将图片、文件等转化为base64进行传输或存储

转化

file转base64

export const FileToBase64 = (file) => {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = (e) => { 
            resolve(e.target.result); 
        };
        reader.onerror = () => {
            reject();
        };
        reader.readAsDataURL(file);
    });
};

blob转base64

export const blobToBase64 = (blob) => {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = (e) => { 
            resolve(e.target.result); 
        };
        reader.onerror = () => {
            reject();
        };
        reader.readAsDataURL(blob);
    });
};

base64转blob

export const base64ToBlob = (code) => {
    const parts = code.split(";base64,");
    const contentType = parts[0].split(":")[1];
    const raw = window.atob(parts[1]);
    const rawLength = raw.length;

    const uInt8Array = new Uint8Array(rawLength);

    for (let i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
    }
    return new Blob([uInt8Array], { 
        "type": contentType 
    });
};

baes64转file

export const base64ToFile = (code, fileName) => {
    const parts = code.split(";base64,");
    const contentType = parts[0].split(":")[1];
    const fileExt = contentType.split("/")[1];
    const raw = window.atob(parts[1]);
    const rawLength = raw.length;

    const uInt8Array = new Uint8Array(rawLength);

    for (let i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
    }
    return new File([uInt8Array], `${ fileName }.${ fileExt }`, { 
        "type": contentType 
    });
};

blob转file

export const blobToArrayBuffer = (blob) => {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = (e) => { 
            resolve(e.target.result); 
        };
        reader.onerror = () => {
            reject();
        };
        reader.readAsArrayBuffer(blob);
    });
};

blob转ArrayBuffer

export const blobToArrayBuffer = (blob) => {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = (e) => { 
            resolve(e.target.result); 
        };
        reader.onerror = () => {
            reject();
        };
        reader.readAsArrayBuffer(blob);
    });
};

file转ArrayBuffer

export const fileToArrayBuffer = (file) => {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = (e) => { 
            resolve(e.target.result); 
        };
        reader.onerror = () => {
            reject();
        };
        reader.readAsArrayBuffer(file);
    });
};

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

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

相关文章

后悔了怎么办 - undo日志

一、undo日志 概念&#xff1a; 把回滚时所需的东西都给记下来 二、事务id 给事务分配id的时机 &#xff08;1&#xff09;对于只读事务来说&#xff0c;只有在它第一次对某个用户创建的临时表执行增、删、改操作时才会为这个事务分配一 个 事务id &#xff0c;否则的话是不…

4.3 转换与处理时间数据

4.3 转换与处理时间数据 4.3.1 转换字符串时间为标准时间1、Timestamp2、DatetimeIndex或者PeriodIndexDatetimeIndex与PeriodIndex函数及其参数说明 4.3.2 提取时间序列数据信息Timestamp类常用属性及说明 4.3.3 加减时间数据Timedelta类周期名称、对应单位及其说明 4.3.4 任务…

Java知识总结

https://www.bilibili.com/video/BV1ys4y1S7Lc 1、Java中线程的实现方式 为什么说本质上只有一种实现线程的方式&#xff1f;实现 Runnable 接口究竟比继承 Thread 类实现线程好在哪里&#xff1f; 实现 Runnable 接口 public class RunnableThread implements Runnable { O…

ai智能改写文案-ai同义转换

文案创作是现代广告营销中不可或缺的一环&#xff0c;一个好的文案不仅可以提升产品的购买率&#xff0c;还可以实现品牌等方面的推广。但是&#xff0c;文案的创作需要耗费大量的时间和精力&#xff0c;如果能够利用智能化技术进行改写&#xff0c;不仅可以大大缩短文案创作时…

JAVA内存不足导致频繁回收和swap引起的性能问题 故障重现(内存篇2)

背景起因&#xff1a; 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行&#xff08;没经历过大并发考验&#xff09;&#xff0c;然而在一次活动后&#xff0c;人数并发一上来后&#xff0c;系统开始卡。 我按经验开始调优&#xff0c;在每个关键步骤…

本地安装directus

简介 Directus 是用于管理 SQL 数据库内容的实时 API 和 App 控制面板。 API会根据数据库模式/内容的实时更改动态更新&#xff08;无需重新启动服务器&#xff09;。 Directus安装在任何新的或现有的 SQL 数据库之上&#xff0c;提供 API 层&#xff08;REST、GraphQL、JS-SD…

获取商品SKU信息API调用代码展示、请求参数和返回值说明

SKU是什么意思 最小存货单位&#xff08;SKU&#xff09;&#xff0c;全称为stock keeping unit&#xff0c;即库存进出计量的基本单元&#xff0c;可以是以件、盒、托盘等为单位。SKU这是对于大型连锁超市DC&#xff08;配送中心&#xff09;物流管理的一个必要的方法。现在已…

MySQL数据库从入门到精通学习第2天(创建数据库)

创建数据库 通过CREATE DATABASE语句来创建数据库通过CREATE SCHEMA语句来创建数据库通过IF NOT EXISTS进行判断创建 通过CREATE DATABASE语句来创建数据库 创建数据库的语法格式如下&#xff1a; CREATE DATABASE 【数据库名】; 创建数据库的库名跟标识符一样也是有要求的&…

实际项目集成分布式一致性协议 Raft

实际项目集成分布式一致性协议 Raft 文章目录 实际项目集成分布式一致性协议 Raft前言1.raft 是什么&#xff1f;2.SOFAJRaft2.1 功能特性 3.Nacos 分布式一致性设计3.1 nacos 分布式协议架构设计3.1 nacos 用 jraft 做什么3.2 Distro 协议 4.实际项目-Spring 工程4.1 旧版项目…

SA168 3BSE003389R1

SA168 3BSE003389R1 远程终端控制系统&#xff08;RTU&#xff09;可连接到其他设备。RTU可将设备上的电气信号转换为数字的值&#xff0c;例如一个开关或阀开/关的状态&#xff0c;或是仪器量测到的压力、流量、电压或电流。也可以借由信号转换及传送信号来控制设备&#xff0…

硬盘分区怎么分?新手该如何操作?

相信很多电脑用户都遇到过硬盘分区的情况。刚拿到手的新电脑&#xff0c;基本上都是一个或两个磁盘分区&#xff0c;这不满足我们的使用习惯&#xff0c;比如我们在不同的分区存放不同的东西&#xff0c;只有一个分区就很难做到&#xff0c;所以这时候需要进行磁盘分区。那么硬…

解读“SAP集成架构咨询方法论”

如果你是SAP ERP相关工作的&#xff0c;建议大家点开原文地址去看&#xff0c;会学习到其他很多与这个行业更多的资料。 原文地址&#xff1a;解读“SAP集成架构咨询方法论” | SAP Blogs 原文地址&#xff1a;解读“SAP集成架构咨询方法论” | SAP Blogs ——————————…

经验分享:如何有效应对Facebook广告数据波动问题?

Facebook广告作为一种重要的数字营销工具&#xff0c;可以帮助企业和品牌快速获得目标受众的关注和转化。然而&#xff0c;由于广告投放过程的不稳定性&#xff0c;Facebook广告数据波动问题也经常出现。 对于广告主而言&#xff0c;如何应对Facebook广告数据波动问题&#xf…

【JVM】JMM

一、JMM JVM 内存模型是用来屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让 Java 程序在各个平台下都能达到一致的内存访问效果。JVM 内存模型规定了所有的共享变量都是存储在主内存&#xff0c;每个线程还有自己的工作内存&#xff0c;线程的工作内存保存了该线…

【教学类-34-01】拼图(运动项目)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)

背景需求&#xff1a; 一个月的Python纸类学具研究中&#xff0c;我发现个别男孩喜欢把作业中的数字、图案、单元格剪成小块&#xff08;小卡片&#xff09;进几周&#xff0c;剪条、剪块的孩子人数也慢慢递增。 幼儿需求&#xff1a;锻炼手指精细动作的需求、或者获得更多物…

Idea+maven+spring-cloud项目搭建系列--13 整合MyBatis-Plus多数据源dynamic-datasource

前言&#xff1a;对于同一个系统&#xff0c;不同的租户需要自己独立分隔的数据库&#xff08;每个数据库的表结构可以是相同的&#xff09;&#xff0c;同时也要支持跨数据源的查询&#xff1b;并且支持分布式事务&#xff0c;如果这里不使用分库分表插件&#xff0c;需要怎样…

python-day4(字符串、列表、生成式和生成器、使用元组、集合、字典)

字符串和常用数据结构 简单用法 所谓字符串&#xff0c;就是由零个或多个字符组成的有限序列&#xff0c;一半记为sa1a2a3…an(0<n<∞)。在python中&#xff0c;如果我们把单个或多个字符用单引号或者双引号包围起来&#xff0c;就可以表示一个字符串。 s1 hello, wo…

【生物信息】用隐马尔可夫模型对生物序列进行建模

文章目录 Modeling biological sequences with HMMSParsing longer sequences. 举例子Our frst HMM: Detecting GC-rich regionsRunning the model: Probability of a sequence 维特比算法 Viterbi一个摸球例子回到课堂 求解参数 来自Manolis Kellis教授的课 教了隐马尔可夫在基…

FPGA开发之HDMI Transmitter接口设计

HDMI简介&#xff1a; High Definition Multimedia 高清多媒体接口&#xff0c;一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号 物理接口&#xff1a; 电气介绍&#xff1a; TMDS&#xff08;Transition Minimized Differential Signaling&#x…

自定义类型——位段

什么是位段&#xff1f; 位段又叫做位域&#xff0c;具体是一种可以把数据以位的形式紧凑的存储&#xff0c;并允许程序员对此结构位进行操作的数据结构 当结构体的成员变量定义之后浪费了较大的空间 &#xff08;比如int a 2&#xff0c;则浪费了30个比特位的空间&#xff0…