我正在编写一个Web浏览器应用程序(客户端),该应用程序可从许多位置下载大量块并将其加入以构建Blob。然后将该Blob作为通用文件保存到本地文件系统。我这样做的方法是通过ArrayBuffer对象和Blob。
var blob = new Blob([ArrayBuffer1, ArrayBuffer2, ArrayBuffer3, ...], {type: mimetype})
这对于中小型文件(直到700 MB aprox)正常工作,但是浏览器会崩溃并显示较大的文件。我了解RAM内存有其局限性。情况是,我需要构建Blob才能生成文件,但我想允许用户下载比该大小大得多的文件(例如,想象一下8GB的文件)。
¿如何建立Blob以避免大小限制?LocalStorage比RAM更受限制,因此我不知道该使用什么或如何做。
看来您只是将数据数组串联在一起?为什么不将数组缓冲区附加到一个巨大的Blob中呢?您必须一次迭代并追加每个arrayBuffer一次。您将seek
在文件编写器的末尾追加数组。为了只读取一部分巨型Blob,您可以获取slice
Blob的一部分,以避免浏览器崩溃。
追加功能
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,在生成您提及的文件时,仅读取巨型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的标头部分中-在提供更精确的反馈之前,我需要了解更多信息。
更新-避免配额限制, 响应下面的评论 ,临时还是永久。
由于使用临时存储,您似乎遇到了存储配额问题。以下是从谷歌借来的片段发现这里
临时存储在浏览器中运行的所有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);
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句