我正在制作一个具有端到端加密功能的简单文件 uploader 。我已关闭上传/加密,但我不确定如何在不导致内存过载的情况下保存更大的文件。比方说我有一个 2gb 的文件,我将以 1kb 的 block 来解密它。但是,一旦我拥有所有这些 block (作为缓冲区或 blob),我如何在本地将它们保存为流?我找到了 this
var json = JSON.stringify(data),
blob = new Blob([json], {type: "octet/stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
但对于大文件,我认为这只会导致浏览器崩溃。
编辑:我找到了 this这表示 blob 的内存限制为 500MiB,这绝对太低了。我在这里有什么选择吗?
最佳答案
您可以在对 new Blob([all,your,chunks])
的一次调用中连接所有 arrayBuffer 或 Blob。
// a simple array to store all our chunks
var chunks = [];
function processChunks() {
// concatenate all our chunks in a single blob
var blob = new Blob(chunks);
// do something with this final blob
var img = new Image();
img.src = URL.createObjectURL(blob);
document.body.appendChild(img);
}
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var b = this.response;
// here we slice our blob
for (var i = 0; i < b.size; i += 1000) {
chunks.push(b.slice(i, i + 1000));
}
console.log(chunks.length);
processChunks();
}
xhr.responseType = 'blob';
xhr.open('get', 'https://dl.dropboxusercontent.com/s/nqtih1j7vj850ff/c6RvK.png');
xhr.send();
img {
width: 100vw;
height: 100vh
}
关于javascript - 如何在需要客户端处理的 JavaScript 中保存大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41206733/