如何在 ES9 中使用 Blob,遇到 bug 如何解决

引言

在当今的 Web 开发过程中,处理二进制数据(如 图像、声音、视频 等等)变得越来越常见,Blob 对象成为了一种常用的处理二进制数据的方法。在 ECMAScript 2018(也叫 ES9) 中,Blob 类进行了重大更新,增加了更多的功能,如本文将阐述的 动态构建 Blob 实例 。

本文将会介绍 Blob 类的用法,以及如何通过处理 Blob 类的 bug 来构建动态 Blob 实例。

  1. Blob 类的用法

Blob 对象表示不可变、原始数据的类数组,它是在 Blob 接口上定义的。Blob 通常用于存储大文件或二进制数据。Blob 对象可以由 ArrayBuffer 对象或者 String 对象构造。

例如,我们可以通过以下代码获得一个 Blob 实例:

--- ---------- - --- ------------ --------- ------ ---------------

这个代码将会构建出一个包含 "Hello World!" 文本的 Blob 对象。如果你想要获得它的内容,可以调用 Blob 对象的 text() 方法:

------------------------------------- -
  ------------------  -- --- ------ -------
---

如果我们想向文件中写入数据,可以使用 FileSaver.js 库提供的 saveAs() 方法,它的使用方法如下:

------------------ ------------------

这个代码将会将这个文本存储到一个文件中。

  1. 构建动态 Blob 对象

有时候我们需要动态地向一个 Blob 对象中添加数据,我们可以通过 ArrayBuffer 对象或其他 Blob 对象来实现这一点。

Blob 对象提供了一个静态方法 Blob.concat() 来将多个 Blob 对象合成一个 Blob 对象:

--- - - --- ------------- --- ------ ---------------
--- - - --- ---------------- ------ ---------------

--- ---------- - -------------- ---

通过 Blob.concat() 可以将 a 和 b 这两个 Blob 对象合成一个新的 Blob 对象,其内容为 "Hello, World!"。

在 ECMAScript 2018 是通过 Blob 构造函数的第一个参数来传递一组 Uint8Array 对象或者 ArrayBuffer 对象,因此我们可以自己构建一个可以动态添加数据的 Blob 对象。

构建一个动态 Blob 实例的方法如下:

----- ----------- -
  ------------- -
    ------------ - ---  -- -- ----------- -----
    ----------- - --  -- ---- ---- -----
  -

  -------------- -
    --------------------------
    ----------- -- ------------------
  -

  --------- -
    --- ------------ - --- ------------------------
    --- ------ - --

    --- ---- - - -- - - -------------------- ---- -
      --- ------ - ----------------
      -------------------- ------------------- --------
      ------ -- ------------------
    -

    ------ --- ----------------------------
  -
-

DynamicBlob 类的 append() 方法将传入的 ArrayBuffer 对象添加到 DynamicBlob 对象的内部数组中,同时更新当前 Blob 对象的长度。getBlob() 方法将这个 Blob 对象的内部数组合成为一个对应的 ArrayBuffer 对象,再通过 Blob 构造函数来构建出一个 Blob 对象。

  1. 处理 Blob 类的 bug

在使用 Blob 类时我们经常会遇到一些 bug,如在 iOS 设备上,当我们构建 Blob 对象的时候会遇到产生的大小超越了 Safari 浏览器所支持的大小的限制的问题。这个 bug 可以通过调整 Chunk size 的大小来避免。

例如在下面这个示例代码中,我们在 Chrome 和 Safari 浏览器中都能够成功地构建出 Blob 对象。(请注意 Console 中的输出)

-------- ----------- -
  --- -------- - ----
  --- --------- - ---- - ---- - -- -- --- ------
  --- ---------- - -------- - --
  --- --------- - -----------
  --- --------- - ---

  --- ---- - - -- - - ----------- ---- -
    --- ---------- - --- -----------------
    --- ---- - - -- - - ---------- ---- -
        ------------- - - - ----
    -
    ------------------ --------- ------------------------ - ----- -------------------------- ----
  -

  --- ---- - --- --------------- - ----- -------------------------- ---
  ---------------------- -------- ---- -- ---- - - -------- - - --- --------- - - ----------- - ---------- - ---- ---------- - - -----------
-

这个代码将会动态地构建一个大小为 512 MB 的 Blob 实例。在执行这个代码的时候,请注意控制台的输出。

结论

当我们在处理二进制数据的时候,Blob 对象成为了一种非常重要的工具。在这篇文章中,我们介绍了 Blob 类的用法,以及如何通过处理 Blob 类的 bug 来构建动态 Blob 实例。这些知识可以帮助你更好地处理 Web 开发过程中的二进制数据。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672c54e6ddd3a70eb6d790f4