有没有一种方法可以将数据流式传输到Blob(或生成巨型Blob)

时间:2018-07-09 13:35:10

标签: javascript html5

检查MDN,我发现曾经有BlobBuilder,我可以打电话给blobBuilder.append继续将数据添加到Blob,但根据MDN BlobBuilder,不赞成使用{{ 3}}。不幸的是Blob构造函数在构造时需要内存中的所有数据。我的数据太大,无法在构造时存储在内存中。看着Blob constructor也看不到任何东西。

有没有一种方法可以生成大型数据客户端并将其放入Blob?例如说我想渲染一个16k x 16k的图像。未压缩的图像是1gig。

我有一种算法,可以一次生成1条或几条扫描线,但是我需要将这些扫描线写到文件/ blob中的方法,然后在完成后,我可以使用标准方法让用户下载该文件blob,但是,我似乎找不到能够让我将数据流式传输到blob的API。

我唯一能想到的就是显然可以从Blob中创建一个Blob,所以我想我可以将图像的每个部分写入单独的blob,然后将所有blob发送到另一个斑点获得大斑点。

那是唯一的解决方案吗?好像有点...奇怪。虽然可以,但是\\((ツ)_ /¯


有人投票关闭,因为他们不明白这个问题。这是另一种解释。

将4个演出写入blob

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

那不会耗尽内存,因为周围的数据永远不会超过1兆。浏览器可以将附加到BlobBuilder的数据刷新到磁盘中。

将4 gig写入Blob的新方法是什么?是只写很多小斑点,然后使用那些斑点生成更大的斑点,还是有一些更传统的方式,其中传统方式是将其散布到某个对象/文件/斑点/存储中。

1 个答案:

答案 0 :(得分:2)

您知道,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位。