正如@jordan-gray 建议的那样,将块保存在 blob 中并将它们连接到更大的 blob 可能是一种解决方案,如果:
- 不需要块的持久性(即关闭浏览器将删除所有块)
- 该文件仅由用户将其保存到他自己的文件系统中。一旦关闭,Web 应用程序将无法访问该文件,除非用户再次授予对已保存文件的访问权限。
- 可能,如果文件大小不是太大(您必须进行基准测试才能找到它)。对于总计 1GB 的块,Chrome 对我来说表现得非常好。
我创建了一个简单的测试来使用 blob 作为 chunks。您可以使用不同的大小和块编号参数:
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。您可能会遇到大小限制或性能限制。