如何计算给定大尺寸(例如 5GB)的 Blob 的摘要?

Put*_*ere 7 javascript

我知道crypto.subtle.digest可用于生成给定 ArrayBuffer 的摘要。

但是,当文件很大时,例如 5GB,我总是收到此错误

Uncaught (in promise) DOMException: 无法读取请求的文件,通常是由于在获取对文件的引用后发生的权限问题。

点击https://jsfiddle.net/kq4s2utf/查看完整版本。

我该如何解决这个问题?

ama*_*rov 5

我相信正确的答案是流式传输文件内容,而不是立即读取内存中的整个文件。Blob 允许将文件作为流读取:https://developer.mozilla.org/en-US/docs/Web/API/Blob/stream

现在的问题是您使用的 Web Cryptography API 不支持流或增量哈希。关于这个问题有一个很长(而且很老)的讨论,但没有明确的结果:https://github.com/w3c/webcrypto/issues/73

我建议使用一些支持增量哈希的第三方库。例如https://github.com/Caligatio/jsSHA

结果代码可能看起来像

async function calcDigest() {
    const reader = finput.files[0].stream().getReader()
    const shaObj = new jsSHA("SHA-256", "ARRAYBUFFER")

    while (true) {
        const {done, value} = await reader.read()
        if (done) break
        shaObj.update(value)
    }

    console.log(shaObj.getHash("HEX"))
}
Run Code Online (Sandbox Code Playgroud)