Javascript 从XmlHttpRequest转换Blob,而不将其完全加载到内存中

Javascript 从XmlHttpRequest转换Blob,而不将其完全加载到内存中,javascript,ajax,file,fileapi,Javascript,Ajax,File,Fileapi,我想在浏览器中实现客户端文件解密。它从服务器获取解密文件,并应在浏览器中对其进行解密,并显示另存为对话框以保存解密文件。它也适用于大文件(1GB或更大) 我有以下策略: 使用XMLHttpRequest和responseType='blob'下载文件 通过转换XMLHttpRequest给出的Blob进行解密 将解密的Blob作为objectURL提供给用户 解密可以像流转换一样工作,它从下载的Blob中读取块,解密数据并写入输出Blob 但是,据我所知,只有在可以将整个文件加载到内存中的情

我想在浏览器中实现客户端文件解密。它从服务器获取解密文件,并应在浏览器中对其进行解密,并显示另存为对话框以保存解密文件。它也适用于大文件(1GB或更大)

我有以下策略:

  • 使用
    XMLHttpRequest
    responseType='blob'
    下载文件
  • 通过转换
    XMLHttpRequest
    给出的Blob进行解密
  • 将解密的Blob作为
    objectURL
    提供给用户
解密可以像流转换一样工作,它从下载的Blob中读取块,解密数据并写入输出Blob

但是,据我所知,只有在可以将整个文件加载到内存中的情况下,这才适用于当前浏览器(在创建
objectURL
之前,需要将完整的解密blob存储在内存中)。当前的
Blob
XMLHttpRequest
createObjectURL
接口似乎不支持任何类型的分块读/写,如上所述。 Blob是不可变的,在浏览器中似乎不支持二进制数据流


有什么方法可以在当前浏览器中实现这一点吗?

在使用
responseType='Blob'获得
Blob
之后,您可以使用获取子视图并使用API获取与此子视图关联的数据。

当然。但是我是否可以读取响应的一个块,将其写入一个新的blob,然后在不首先完成响应的情况下开始保存文件。我不想在将整个文件保存到用户磁盘之前将其保存在内存中。@GregorMüllegger这是另一个问题。在Firefox中,您可以使用
responseType='moz blob'
(例如,进行中事件)。其他浏览器还不支持流式XHR响应体。如果您想在所有浏览器(现在)中有效地流式传输,可以使用HTTP范围请求。但服务器必须支持此标准功能,才能使其正常工作。谢谢。我的问题的要点是,我想让用户从服务器保存一个文件。但在这两者之间,我想在浏览器中修改(解密)文件,而不需要在将整个文件一次性保存到磁盘之前将其保存在内存中。范围请求是个好主意!但它们只解决了部分问题,将文件的分块写入用户磁盘。@GregorMüllegger在Chrome中,您可以使用
requestFileSystem
获得一个沙盒文件系统来写入中间块,以便获得完整的文件,而不必将其存储在内存中。在Firefox中,您可以使用
IndexedDB
实现此目的(并使用
Blob
构造函数重新组装文件)。