将客户端生成的数据以JavaScript文件的形式分块保存

将客户端生成的数据以JavaScript文件的形式分块保存,javascript,html,flash,firefox,webrtc,Javascript,Html,Flash,Firefox,Webrtc,我正在用webRTC开发一个文件共享应用程序。我想用JavaScript/HTML实现客户端。代码应该在客户端浏览器上运行。 我需要在通过webRTC下载时保存它们。这些文件可能相当大,在将它们作为文件保存到磁盘之前,我无法完全加载它们并将它们保存在数组或blob中 是否有任何API允许我在收到文件时将其分块保存 到目前为止,我已经找到了。 虽然前两个文件不是分块的,需要我在保存之前先将完整的文件下载到内存中,但FileWriterAPI在大多数浏览器上都不可用 你退房了吗?它应该满足您的需求正

我正在用webRTC开发一个文件共享应用程序。我想用JavaScript/HTML实现客户端。代码应该在客户端浏览器上运行。 我需要在通过webRTC下载时保存它们。这些文件可能相当大,在将它们作为文件保存到磁盘之前,我无法完全加载它们并将它们保存在数组或blob中

是否有任何API允许我在收到文件时将其分块保存

到目前为止,我已经找到了。
虽然前两个文件不是分块的,需要我在保存之前先将完整的文件下载到内存中,但FileWriterAPI在大多数浏览器上都不可用

你退房了吗?它应该满足您的需求

正如@jordan gray所建议的那样,将块保存在blob中并将它们连接到一个更大的blob中可能是一个解决方案,如果:

  • 不需要块的持久性(即关闭浏览器将删除所有块)
  • 只有将文件保存到自己的文件系统中的用户才能持久化该文件。关闭文件后,web应用程序将无法访问该文件,除非用户再次授予对已保存文件的访问权限
  • 可能,如果文件大小不是太大(您必须进行基准测试才能找到答案)。Chrome对我来说表现得相当不错,总容量为1GB
我创造了一个新的世界。您可以使用不同的大小和块数参数:

var chunkSize = 500000;
var totalChunks = 200;
var currentChunk = 0;
var mime = 'application/octet-binary';
var waitBetweenChunks = 50;

var finalBlob = null;
var chunkBlobs =[];

function addChunk() {
    var typedArray = new Int8Array(chunkSize);
    chunkBlobs[currentChunk] = new Blob([typedArray], {type: mime});
    console.log('added chunk', currentChunk);
    currentChunk++;
    if (currentChunk == totalChunks) {
        console.log('all chunks completed');
        finalBlob = new Blob(chunkBlobs, {type: mime});
        document.getElementById('completedFileLink').href = URL.createObjectURL(finalBlob);
    } else {
        window.setTimeout(addChunk, waitBetweenChunks);
    }
}
addChunk();
如果您确实需要这种持久性,W3C应该支持您所需要的。您可以使用它将区块写入单独的文件,然后在所有区块完成后,您可以读取所有区块并将其附加到单个文件中,然后删除区块

请注意,它通过为您的应用程序分配沙盒文件系统(对于给定配额)来工作,并且这些文件只能由该应用程序访问。如果这些文件是要在web应用程序之外使用的,那么您可能需要使用该函数将文件从应用程序文件系统保存到他的“正常”文件系统。你可以用这个方法做类似的事情


关于浏览器支持的当前状态,您是对的。是可用的,它基于(更广泛地支持)作为文件系统仿真后端。我没有在大文件上测试polyfill。您可能会遇到大小限制或性能限制。

我有两个链接,这两个链接可以帮助您获得大小合理的文件,我的第一反应是将每个块存储在自己的
Blob
中,最后将它们连接到一个大
Blob
(使用新的构造函数)并使用
createObjectURL
保存最后的
Blob
。IIRC,JS
Blob
s在必要时存储在磁盘上,因此除非文件真的很大(或者我真的错了),否则不会太可怕?@JordanGray可能是个好主意-我假设下载的块需要在浏览器会话之间持续下载,但如果不是,这可能是最干净的主意(如果浏览器确实实现了在需要时将blob持久化到文件中)。这似乎也是他们的一个问题……是的,这正是我的想法。根据我对规范的理解,它应该能够很好地扩展,在必要时将块持久化到底层存储中。:)在保存到磁盘之前,这看起来仍然是先保存到内存的
(currentChunk==totalChunks)
,对吗?不,想象一下new Blob()就像它返回指向磁盘上对象的指针一样@AmitayDobo它如何显示从第一块开始的下载过程,我希望它显示浏览器的下载行为。能做到吗?