代码之家  ›  专栏  ›  技术社区  ›  gman

有没有办法将数据流到blob(或生成一个巨大的blob)

  •  1
  • gman  · 技术社区  · 7 年前

    检查MDN我发现以前 BlobBuilder 我可以打电话给你 blobBuilder.append 根据mdn继续向blob添加数据 Blobbuilder公司 不赞成 Blob constructor 是的。不幸的是 团块 构造函数在构造时需要内存中的所有数据。我的数据太大,无法在施工时存储。看着 File API 也看不到任何东西。

    有没有办法生成大型数据客户端并将其放入blob中?例如,我想渲染一个16kx16k的图像。未压缩的那是一个1大的图像。

    我有一个算法可以一次生成一行或几行扫描行,但我需要一种方法将这些扫描行写入一个文件/blob中,然后在完成后,我可以使用标准方法让用户下载该blob,但是,我似乎找不到一个api,让我将数据流到blob中。

    我唯一能想到的就是我能 团块 团块 所以我想我可以把图像的每一部分都写到一个单独的blob中,然后把所有的blob发送到另一个blob中,得到一个大blob。

    这是唯一的解决办法吗?好像有点…很奇怪。不过,如果成功了,那么_/


    有人投票决定结束,因为他们不明白这个问题。这是另一种解释。

    给一个家伙写4个

     const arrays = [];
     for (let i = 0; i < 4096; ++i) {
       arrays.push(new Uint8Array(1024 * 1024)); // 1 meg
     }
     // arrays now holds 4 gig of data
     const blob = new Blob(arrays);
    

    上面的代码将崩溃,因为浏览器将杀死使用过多内存的页面。使用 Blobbuilder公司 我本可以做些

     const builder = new BlobBuilder();
     for (let i = 0; i < 4096; ++i) {
       const data = new Uint8Array(1024 * 1024); // 1 meg
       builder.append(data);
     }
     const blob = builder.getBlob(...);
    

    这不会耗尽内存,因为周围的数据永远不会超过1MEG。浏览器可以刷新附加到 Blobbuilder公司 输出到磁盘。

    有什么新的方法可以实现一个blob写4个gig?它是只写大量的小blob,然后用它们生成一个更大的blob,还是有一些更传统的方式,传统的方式意味着进入某个对象/文件/blob/存储。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Theraot    7 年前

    如您所知,blob将包含的数据必须准备好传递给构造函数。让我们以mdn为例:

    var aFileParts = ['<a id="a"><b id="b">hey!</b></a>'];
    var oMyBlob = new Blob(aFileParts, {type : 'text/html'});
    

    现在,我们有两个选择:

    1. 我们可以将数据附加到数组,然后将其转换为blob:

      var aFileParts = ['<a id="a"><b id="b">hey!</b></a>'];
      aFileParts.push('<p>How are you?</p>');
      var oMyBlob = new Blob(aFileParts, {type : 'text/html'});
      
    2. 或者,我们可以使用blob创建blob:

      var oMyOtherBlob = new Blob([], {type: 'text/html'});
      oMyOtherBlob = new Blob([oMyOtherBlob, '<a id="a"><b id="b">hey!</b></a>'], {type : 'text/html'});
      oMyOtherBlob= new Blob([oMyOtherBlob, '<p>How are you?</p>'], {type : 'text/html'});
      

    你可以自己建造 BlobBuilder 封装…考虑到附加到数组似乎会导致内存不足,让我们封装第二个选项:

    var MyBlobBuilder = function() {
         var blob = new Blob([], {type: 'text/html'});
         this.append = function(src)
         {
             blob = new Blob([blob, src], {type: 'text/html'});
         };
         this.getBlob = function()
         {
             return blob;
         }
    };
    

    注意:用您的代码测试(替换 Blobbuilder公司 具有 MyBlobBuilder )没有耗尽我机器上的内存。Windows 10、Chrome 67、8 GB RAM、Intel Core i3-64位。

    推荐文章