Blob、File、FileReader、ArrayBuffer、TypeArray、DataView

1、Blob 对象表示一个不可变、原始数据的类文件对象。

构造函数:new Blob(array, options)。

    参数array:是一个数据数组,可以是多种对象的数据,包含 ArrayBuffer、Blob、String 等等。

    参数options:可选对象,指定两个属性:

        type 表示Blob对象数据的MIME类型;

        endings 指定包含行结束符\n的字符串如何写入。

    示例 const blob = new Blob(['123456789'], {type : 'text/plain'});

常用方法:

    let subBlob = blob.slice(0, 3)

   //返回一个新的 Blob 对象,包含了源 Blob 对象中指定范围内的数据。

    console.log(subBlob)//Blob

    blob.text().then((txt) => {

            //返回一个 promise,其会兑现一个包含 Blob 所有内容的 UTF-8 格式的字符串

            console.log(txt);//123456789

    });

    blob.arrayBuffer().then((buffer) => {

           //返回一个 promise,其会兑现一个包含 Blob 所有内容的二进制格式的ArrayBuffer

            console.log(buffer);//ArrayBuffer

    });

   let rs = blob.stream();

  //返回一个能读取 Blob 内容的 ReadableStream

  console.log(rs)

2、File对象继承了Blob对象,是一种特殊类型的Blob,它扩展了对系统文件的支持能力。

构造函数:new File(bits, name[, options])

    bits:是一个数据数组,可以是多种对象的数据,与Blob对象类似

    name:文件名称

    options:可选属性对象,包含两个选项

        type:MIME类型字符串

        lastModified:时间戳,表示文件的最后修改时间

示例: const file = new Blob(['123456789'], {type : 'text/plain'});

常用方法:

     let subFile = file.slice(0, 3)

   //返回一个新的 File 对象,包含了源 File 对象中指定范围内的数据。

3、对Blob和File的读取

主要有FileReader、URL.createObjectURL()、createImageBitmap()和XMLHttpRequest.send()。

    3.1、fileReader是用于异步读取文件类型(或原始数据缓冲区)的内容,指定Blob或File对象为需要读取的文件数据。

    let fileReader = new FileReader();

    fileReader.readAsText(file, [encoding]);//读取txt文件,参数encoding可选

    fileReader.readAsDataURL(file);//读取图像或者能够嵌入到html文档的格式文件,并返回data: URL 格式的     Base64 字符串

    readAsBinaryString(file)//以原始二进制数据类型读取Blob中的内容

    fileReader.readAsArrayBuffer(file);//读取任意类型的文件,并返回ArrayBuffer数据对象

    fileReader.onerror = function(e){console.log(e)}

    fileReader.onabort = function(e){console.log(e)}

    fileReader.onloadstart = function(e){console.log(e)}

    fileReader.onprogress = function(e){console.log(e)}

    fileReader.onloadend = function(e){console.log(e)}

     fileReader.onload = function (e) {

        let result = e.target.result;

        console.log(result);

     };

    3.2URL.createObjectURL()。URL是浏览器环境提供的,用于处理url链接的一个接口对象。可以通过它,解析、构造、规范和编码各种url链接。而URL提供的一个静态方法 createObjectURL(),可以用来处理Blob和File文件对象。

    示例:

    const url = URL.createObjectURL(file) 

     const img = new Image()

     img.onload = () => { document.body.append(img) } 

     img.src = url //blob:http://localhost:8088/29c8f4a5-9b47-436f-8983-03643c917f1c

    Object URL 又被称为Blob URL,一般使用Blob或File对象生成,通过 URL.createObjectURL() 方法创建一个唯一的URL。

Object URL的格式为:blob:origin/唯一标识(uuid)。

上面生成的URL字符串就符合这个格式:blob:http://localhost:8088/29c8f4a5-9b47-436f-8983-03643c917f1c。

origin 对应的 http://localhost:8088/,如果直接打开本地html文件,则origin为null。

uuid 对应 29c8f4a5-9b47-436f-8983-03643c917f1c。

浏览器内部会为生成Object URL保持一个 URL 到 Blob 的映射,Blob是留存在内存中,浏览器只有在卸载当前窗口文档时才会释放。

如果要手动释放,则需要URL的另外一个静态方法:URL.revokeObjectURL(),它用于销毁之前创建的URL实例,在合适的时机调用即可销毁Object URL。

URL.revokeObjectURL(url)

3.3createImageBitmap()

createImageBitmap(): 主要处理图片资源,接受不同的图片资源对象为参数,并生成一个ImageBitmap对象。

这些参数就就可以是Blob和File对象。

示例:

createImageBitmap(file).then(imageBitmap => {

  const canvas = document.createElement('canvas')

  canvas.width = imageBitmap.width

  canvas.height = imageBitmap.height

  const ctx = canvas.getContext('2d')

  ctx.drawImage(imageBitmap, 0, 0)

  document.body.append(canvas)

})

3.4XMLHttpRequest.send()

XMLHttpRequest.send(body):用于在XHR的HTTP请求中,发送数据体。这里的body参数,可以是多种数据类型,包括Blob对象。

示例:

const xhr = new XMLHttpRequest()

xhr.send(new Blob())

4、ArrayBuffer

ArrayBuffer 对象表示通用的、固定长度的原始二进制缓冲区,它是一个字节数组,但不能直接操作它的内容,而需要通过其他方式(如TypeArray或DataView等)进行处理。

构造函数:new ArrayBuffer(length),返回一个指定大小的ArrayBuffer对象。

参数length:要创建的 ArrayBuffer 的字节大小。大于Number.MAX_SAFE_INTEGER(>= 2 ** 53)或为负数,则抛出一个RangeError异常。

首先获取一个arrayBuffer示例:

    const reader = new FileReader()

    reader.readAsArrayBuffer(file)

    reader.onload = async (event) => {

        console.log(event.target.result)

    }

由于我们无法直接操作ArrayBuffer,所以需要使用其他对象来处理,下面将介绍其中两种。

    4.1TypeArray,即类型化数组,它描述了二进制数据缓冲区的一个类数组。TypeArray本身不是一个可用的对象,只是一个辅助的数据类型,作为所有类型数组的构造原型,真正可用的类型数组包含了多种,如Int8Array、Uint8Array等。

常用的类型数组如下表所示:


类型化数组与普通数据也较相似,同样拥有一系列的方法和属性,但不支持 push、pop、shift、unshift、splice 等可以改变原数组的增删改方法。

类型化数组由于定义了数据类型,则各元素必须是同类型的数据,不能像普通数据那样元素可以是不同类型;当元素数据类型固定统一时,处理效率更优。

各类型数组在构造函数、属性、方法等语法上相同,下面就以 Uint8Array 为例。

构造函数:

new Uint8Array()

new Uint8Array(length)

new Uint8Array(typedArray)

new Uint8Array(object)

new Uint8Array(buffer [, byteOffset [, length]])

静态属性和方法:

BYTES_PER_ELEMENT:返回数组元素所占字节数,Uint8Array中的值是1,Uint32Array中的值是4,见上表

length:固定长度,Uint8Array中的值是1,Uint32Array中的值是3,基本没用

name:类型数组返回自己的构造名,Uint8Array类型返回 Uint8Array,Uint32Array类型返回 Uint32Array 等等

from(source[, mapFn[, thisArg]]):从源类型数组中返回一个新的数组

of(element0[, element1[, …[, elementN]]]):创建一个具有可变数量参数的新类型数组

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容