看起来你只是简单地将数据数组串联在一起?为什么不通过一个巨大的 blob 来追加 array-buffers 呢?你需要逐个迭代和追加每个 arrayBuffer。你可以使用 seek
到文件写入器的末尾去追加数组。如果只想读取你的巨大 blob 的某些部分,你可以获取 blob 的 slice
以避免浏览器崩溃。
追加函数
function appendToFile(fPath,data,callback){
fs.root.getFile(fPath, {
create: false
}, function(fileEntry) {
fileEntry.createWriter(function(writer) {
writer.onwriteend = function(e) {
callback();
};
writer.seek(writer.length);
var blob = new Blob([data]);
writer.write(blob);
}, errorHandler);
}, errorHandler);
}
为了避免读取整个大型blob,只有在生成您提到的文件时才阅读部分/块。
部分读取功能
function getPartialBlobFromFile(fPath,start,stop,callback){
fs.root.getFile(fPath, {
creation:false
}, function(fileEntry){
fileEntry.file(function(file){
var reader = new FileReader();
reader.onloadend = function(evt){
if(evt.target.readyState == FileReader.DONE){
callback(evt.target.result);
}
};
stop = Math.min(stop,file.size);
reader.readAsArrayBuffer(file.slice(start,stop));
}, errorHandler)
}, errorHandler);
}
您可能需要保留索引,例如在您的大型二进制大对象(BLOB)的标题部分中 - 在我能够给出更精确的反馈之前,我需要了解更多信息。
更新 - 避免配额限制,临时存储与持久存储
回应下面的评论
看起来您正在使用临时存储而遇到了存储配额问题。以下是从 Google 找到的一段摘录(点击这里)
临时存储被所有运行在浏览器中的 Web 应用程序共享。共享池可以达到可用磁盘空间的一半。已被应用程序使用的存储也包括在共享池的计算中;就是说,计算是基于(可用存储空间 + 应用正在使用的存储)* .5。
每个应用程序最多可以拥有共享池的 20%。例如,如果总可用磁盘空间为 50 GB,则共享池为 25 GB,并且应用程序最多可以拥有 5 GB。这是从可用磁盘空间(50 GB)的一半(最多 25 GB)的 20%(最多 5 GB)计算而来的。
要避免此限制,您需要切换到持久存储,它将允许您配额与磁盘上可用的空闲空间一样多。为此,请使用以下方法初始化文件系统,而不是使用临时存储请求。
navigator.webkitPersistentStorage.requestQuota(1024*1024*5,
function(gB){
window.requestFileSystem(PERSISTENT, gB, onInitFs, errorHandler);
}, function(e){
console.log('Error', e);
})