如何在javascript中克隆blob

时间:2016-06-14 02:26:31

标签: javascript

我正在拼命尝试在javascript中克隆blob而不使用外部库(例如jQuery)。

我试过JSON.parse(JSON.stringify(blob))但没有成功。

2 个答案:

答案 0 :(得分:6)

来自文档:

  

要创建包含另一个blob数据子集的Blob,请使用slice()方法。

所以你可以使用

var copy = blob.slice();

它也说

  

要从其他非blob对象和数据构造Blob,请使用Blob()构造函数。

并查看构造函数文档,表明以下内容也应该起作用:

var copy = new Blob([blob], {type: blob.type});

答案 1 :(得分:0)

请注意,接受的答案不会克隆基础数据,它会创建另一个引用。 new Blob([myBlob])也是如此。通常这就是您想要的,因为它避免了在内存中创建文件的额外副本,这在普通文件大小上可能会很昂贵。但是,由于File对象也是引用而不是副本,因此导致如下行为:

  1. 用户上传文件
  2. 您收到文件,将其克隆,还可能向用户显示以表明您确实拥有文件
  3. 用户删除,重命名或移动原始文件
  4. 您的文件副本消失

为避免这种情况,您需要实际克隆基础数据,您可以使用此功能进行操作。

const cloneBlob = b => new Promise((resolve, reject) => {
  const r = new FileReader();
  r.readAsArrayBuffer(b);

  r.addEventListener('load', _ => {
    resolve(new Blob([r.result], {type: b.type}));
  });

  r.addEventListener('error', _ => {
    reject();
  });
});