如何在javascript中克隆blob

如何在javascript中克隆blob,javascript,Javascript,我正在拼命尝试在javascript中克隆一个不使用外部库(如jQuery)的对象 我尝试了JSON.parse(JSON.stringify(blob)),但没有成功。来自文档: 要创建包含另一个blob数据子集的blob,请使用slice()方法 所以你可能需要 var copy = blob.slice(); 它还说 要从其他非Blob对象和数据构造Blob,请使用Blob()构造函数 查看施工人员的文件表明,以下内容也应适用: var copy = new Blob([blob], {

我正在拼命尝试在javascript中克隆一个不使用外部库(如jQuery)的对象


我尝试了
JSON.parse(JSON.stringify(blob))
,但没有成功。

来自文档:

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

所以你可能需要

var copy = blob.slice();
它还说

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

查看施工人员的文件表明,以下内容也应适用:

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

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

  • 用户上传一个文件
  • 您接收文件,克隆它,可能会将其显示给用户,以表明您确实拥有它
  • 用户删除、重命名或移动原始文件
  • 你的文件副本消失了
  • 为了避免这种情况,您需要实际克隆底层数据,这可以通过此函数实现

    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();
      });
    });
    

    请详细说明“blob”。您是否尝试了链接到的文档中的建议?“要创建包含另一个blob数据子集的blob,请使用slice()方法”@FelixKling我已经添加了一个指向blob单词的链接。在我的例子中,blob是一个pdf文件,但我不认为它对这个问题有影响。。。