【问题标题】:Transform Blob from XmlHttpRequest without loading it completely into memory从 XmlHttpRequest 转换 Blob 而不将其完全加载到内存中
【发布时间】:2014-12-16 12:05:01
【问题描述】:

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

我有以下策略:

  • 使用XMLHttpRequestresponseType = 'blob' 下载文件。
  • 通过转换 XMLHttpRequest 给出的 Blob 进行解密。
  • 将解密后的 Blob 作为 objectURL 提供给用户。

解密可以像流转换一样工作,它从下载的 Blob 中读取块,解密数据并写入输出 Blob。

但是据我所知,这仅适用于当前浏览器,前提是您可以将整个文件加载到内存中(您需要将完整的解密 blob 存储在内存中,然后才能创建 objectURL)。当前的BlobXMLHttpRequestcreateObjectURL 接口似乎不支持任何分块读/写,如Mozilla Developer Network 所述。 Blob 是不可变的,并且在浏览器中似乎没有对二进制数据的流式支持。

有什么方法可以用当前的浏览器来实现吗?

【问题讨论】:

    标签: javascript ajax file fileapi


    【解决方案1】:

    在得到BlobresponseType = 'blob'; 后,可以使用blob.slice(start, end) 获取子视图,并使用FileReader API 获取与此子视图关联的数据。

    【讨论】:

    • 当然。但是我可以读取响应的一部分,将其写入一个新的 blob 并开始保存文件,而无需先完成响应。我不想在将整个文件保存到用户磁盘之前将其保存在内存中。
    • @GregorMüllegger 这是一个不同的问题。在 Firefox 中,您可以使用 responseType = 'moz-blob'(例如进行中的事件)。其他浏览器尚不支持流式 XHR 响应主体。如果您想在所有浏览器中有效地流式传输(今天),您可以使用 HTTP Range 请求。但是,服务器必须支持此标准功能才能使其正常工作。
    • 谢谢。我的问题的要点是我想让用户从服务器保存文件。但在这两者之间,我想在浏览器中修改(解密)文件,而不需要将整个文件保存在内存中,然后再一次将其保存到磁盘。范围请求是个好主意!但他们只解决了部分问题,将文件分块写入用户磁盘。
    • @GregorMüllegger 在 Chrome 中,您可以使用 requestFileSystem 获取沙盒文件系统来写入中间块,以便获取完整的文件,而无需将其存储在内存中。在 Firefox 中,您可以为此使用 IndexedDB(并使用 Blob 构造函数重新组装文件)。
    猜你喜欢
    • 2011-08-17
    • 2023-03-21
    • 2015-09-11
    • 2018-01-25
    • 2023-03-10
    • 1970-01-01
    • 2011-05-16
    • 2015-02-27
    • 2013-01-08
    相关资源
    最近更新 更多