二进制数据Blob,file,ArrayBuffer,fileReader...

151 阅读3分钟

二进制数据

上图:

1.png

Blob

blob是一个二进制数据的大对象(类文件对象),存储了二进制数据;不可修改须通过fileReader工具操作;一个Blob对象通常由一个或多个ArrayBuffer对象组成的数组。

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

创建

const _blob = new Blob(array,options)
  • 两个参数(可选)
    • array:ArrayBuffer/ArrayBufferView/Blob/DOMString...
    • options:{type,endings}
      • type:MIME类型
      • endings:默认值为"transparent",用于指定包含行结束符\n的字符串如何被写入,不常用

常见的MIME类型

3.jpg
  • 属性

    • size (只读):Blob对象中包含的数据大小(字节)
    • type (只读):表明该Blob对象所包含数据的MIME类型。例如若为图片,此字段就类似为 image/jpeg。如果类型未知,则该值为空字符串。
  • 方法

    • slice(start,end,contentType) : 实现对文件的分割,并返回一个新的 Blob 对象,该对象包含调用它的 blob 的子集中的数据。
      • start:开始索引,可以为负数,语法类似于数组的slice方法。默认值为0。
      • end:结束索引,可以为负数,语法类似于数组的slice方法。默认值为最后一个索引。
      • contentType:新的Blob对象的MIME类型,这个值将会成为新的Blob对象的type属性的值,默认为一个空字符串。
    _blob.slice(start, end ,contentType)
    
    • arrayBuffer() : 返回一个 Promise,其会兑现一个包含 blob 二进制数据内容的 ArrayBuffer。将blob对象转为ArrayBuffer对象,类似fileReader.readAsArrayBuffer()将blob对象转为arrayBuffer对象

ArrayBuffer

ArrayBuffer 是 JavaScript 中用于表示通用、固定长度的原始二进制数据缓冲区的对象。它是一种低级别的数据结构,通常用于处理二进制数据,例如网络请求、文件读取或与 WebAssembly 交互。

我们可以对ArrayBuffer进行读写,但需要借助它提供的工具TypeArray或DataView

const buffer = new ArrayBuffer(8); // 8个字节的数据缓存区

File

file顾名思义就是一个文件对象;不能通过代码主动创建,要么通过 选择的 FileList 对象,要么通过拖拽的拿到event.DataTransfer对象中的files;file基础Blob,Blob的属性和方法都可以用于 File,而 File 自己也有自己特有的属性和方法(详情:MDN)

  • 转换
    • File -> Blob:因为File是继承于Blob,不用进行转换
    • Blob -> File:通过new File([blob],fileName,{type:MIME})

fileReader

fileReader是一个工具,与上面三个数据容器不一样

方法

  • readAsArrayBuffer():读取指定 Blob 中的内容,完成之后,result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象;
  • FileReader.readAsBinaryString():读取指定 Blob 中的内容,完成之后,result 属性中将包含所读取文件的原始二进制数据;
  • FileReader.readAsDataURL():读取指定 Blob 中的内容,完成之后,result 属性中将包含一个data: URL 格式的 Base64 字符串以表示所读取文件的内容。
  • FileReader.readAsText():读取指定 Blob 中的内容,完成之后,result 属性中将包含一个字符串以表示所读取的文件内容。

事件

  • abort:该事件在读取操作被中断时触发;
  • error:该事件在读取操作发生错误时触发;
  • load:该事件在读取操作完成时触发;
  • progress:该事件在读取 Blob 时触发。

Blob与ArrayBuffer的区别

1)从Blob的创建就能看出,Blob是经过ArrayBuffer包装过的对象,所以ArrayBuffer比Blob更加底层。

2)Blob是一个二进制数据整体,一个类文件对象,所以有属性type,有大小size。

3)ArrayBuffer就是纯纯的内存上的二进制数据,我们可以对其任何一个字节进行单独的修改,我们可以对字节进行操作,更加的细节。

4)两者都是数据容器