文件

文件处理

Blob

我们也可以使用 FileReader 读取 blob 数据,并打印出来:

const ab = new ArrayBuffer(32);
const iA = new Int8Array(ab);
iA[0] = 97;
const blob = new Blob([iA], { type: "application/octet-binary" });
const fr = new FileReader();
fr.addEventListener("load", function (ev) {
  console.log(ev.target.result); //会输出字符:a
});
fr.readAsText(blob);

如果要把 blob 文件转化为二进制的数据的话,要先把 blob 转化为 arraybuffer,然后再使用 typedArray 就可以直接编辑二进制数据了:

const ab = new ArrayBuffer(32);
const iA = new Int8Array(ab);
iA[0] = 97;
const blob = new Blob([iA], { type: "application/octet-binary" });
const fr = new FileReader();
fr.addEventListener("load", function (ev) {
  const abb = ev.target.result;
  const iAA = new Int8Array(abb);
  console.log(iAA);
});
//把blob文件转化为arraybuffer;
fr.readAsArrayBuffer(blob);

arraybuffer -->> typedarray -->> blob -->> blob 通过 FileReader 转化为 arraybuffer 或者 text 文本或者 base64 字符串;arraybuffer 和 typedarray 主要是处理二进制,如果要把 blob 往二进制转换,必须先把 blob 转换为 arraybuffer,然后再转换为可以编辑的 typedArray;实际上,还有一种比较常用的数据类型,base64 编码的数据,常用的比如 image 的 base64 的编码,文本的 base64 编码等,也可以把 base64 的编码转化为对应的 ascll 码,再转化为 typearray,然后再生成 blob 对象:

function dataURLtoBlob(dataurl) {
  const arr = dataurl.split(","),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  //通过atob把base64转化为ascll码,然后再把ascll码转化为字节码
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  //u8arr就是2进制的数据
  return new Blob([u8arr], { type: mime });
}

FileReader

通过 FileReader,我们能够方便地在 ArrayBuffer 与 Blob 之间转化:

// ArrayBuffer -> Blob
const uint8Array = new Uint8Array([1, 2, 3]);
const arrayBuffer = uint8Array.buffer;
const blob = new Blob([arrayBuffer]);

// Blob -> ArrayBuffer
const uint8ArrayNew = null;
const arrayBufferNew = null;
const fileReader = new FileReader();
fileReader.onload = function (event) {
  arrayBufferNew = event.target.result;
  uint8ArrayNew = new Uint8Array(arrayBufferNew);

  // warn if read values are not the same as the original values
  // arrayEqual from: http://stackoverflow.com/questions/3115982/how-to-check-javascript-array-equals
  function arrayEqual(a, b) {
    return !(a < b || b < a);
  }
  if (arrayBufferNew.byteLength !== arrayBuffer.byteLength)
    // should be 3
    console.warn("ArrayBuffer byteLength does not match");
  if (arrayEqual(uint8ArrayNew, uint8Array) !== true)
    // should be [1,2,3]
    console.warn("Uint8Array does not match");
};
fileReader.readAsArrayBuffer(blob);
fileReader.result; // also accessible this way once the blob has been read
上一页