【问题标题】:Bypass blob 500mb limit to save bigger file on disk绕过 blob 500mb 限制以在磁盘上保存更大的文件
【发布时间】:2015-08-15 17:59:21
【问题描述】:

我正在摆弄WebRTC 文件共享,但现在遇到了blob 的问题。似乎(至少在谷歌浏览器上)blob 文件的限制为 500mb。
我的接收器收到ArrayBuffers 并从中生成 blob,然后将其存储在数组中。当最后一个ArrayBuffer 被接收时——一个大的blob 被构建,链接被创建并提供给用户下载一个文件。我试图发送 800mb 的文件,但大 blob 的上限为 500mb,因此文件已损坏。据我了解,这是一个众所周知的 blob 内存限制,并且可以以某种方式绕过(我想https://www.sharefest.me/ 做到了?),但是如何?
或者也许还有其他方法让用户获取到组合数组缓冲区的链接并将它们保存为文件?

这是我的接收者的代码:

var finalBlob;   
var ind = 0;   
var f = files_r[ind];//file
var part = f.currentChunk;    
var blobs = f.fileblobs;

blobs.push(new Blob([data], {
    type: f.mime
}));
f.currentChunk++; 

if (f.currentChunk === f.totalchunks) {
    finalBlob = new Blob(blobs, {
        type: f.mime
    });
    var link = g(ind + '_link');       
    var url = URL.createObjectURL(finalBlob);
    link.href = url;       
    link.download = f.name;
    console.log("finished");        
}

【问题讨论】:

    标签: javascript file blob webrtc file-sharing


    【解决方案1】:

    您应该将 blob 保存到 IndexedDB,然后查询它们,创建结果 blob 并提供指向它的链接。看看这里的讨论https://code.google.com/p/chromium/issues/detail?id=375297。我使用 Dexie(IndexedDB 的包装器)将块保存/检索到 IndexedDB。

    【讨论】:

    • 那么,您将如何避免将生成的 blob 保存在内存中,据我所知,要创建一个链接,此时您需要将这个 blob 放在内存中,所以 500mb 限制又回来了?跨度>
    • 其实不是。我不知道为什么,但是您从 blobs 数组浏览器创建 blob 要么不将 blob 数据复制到一个块,而只创建引用,要么使生成的 blob 文件像其块一样基于文件。你应该自己试试看。
    • hm 很有趣,是的,我过一段时间一定会试试的,谢谢你的建议!
    • 是的,它之所以有效,是因为浏览器使用 blob 不可变的事实将来自各种地方的东西拼接在一起,而无需任何复制,因为它们知道 blob 不能在他们的脚下更改。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2011-01-15
    • 1970-01-01
    • 2017-04-28
    • 2011-07-06
    • 2017-07-18
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多