我正在使用webRTC开发FileShare应用程序。我想用JavaScript / HTML实现客户端。该代码应在客户端浏览器上运行。通过webRTC下载时,我需要保存它们。这些文件可能很大,在将它们另存为磁盘之前,我无法完全卸载它们并将它们保存在数组或blob中。
是否有任何API允许我在收到文件时将文件分块保存?
到目前为止,我已经找到Downloadify,FileSave.js和html5 FileWriterApi。尽管前两个没有分块,并且要求我先将完整文件下载到内存中才能保存,但大多数浏览器都不提供FileWriterAPI。
正如@ jordan-gray所建议的,在以下情况下,将块保存在blob中并将其连接到更大的blob可能是一种解决方案:
我创建了一个简单的测试,将blob用作块。您可以使用不同的大小和块号参数:
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文件系统API应该支持您所需要的。您可以使用它来写块以分离文件,然后在完成所有块后,您可以全部读取它们并将它们附加到单个文件中,然后删除这些块。
请注意,它是通过为应用程序分配沙盒文件系统(给定配额)来工作的,并且文件只能由该应用程序访问。如果文件打算在Web应用程序之外使用,则可能需要使用该功能将文件从应用程序文件系统保存到他的“常规”文件系统中。您可以使用createObjectURL()方法执行类似的操作。
您对浏览器支持的当前状态是正确的。提供了Filesystem API polyfill,它基于IndexedDB(被更广泛地支持)作为文件系统仿真后端。我没有在大文件上测试polyfill。您可能会遇到大小限制或性能限制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句