【问题标题】:XHR2 file transfers. Accessing binary data during `progress` event handlerXHR2 文件传输。在 `progress` 事件处理程序期间访问二进制数据
【发布时间】:2023-04-05 19:31:01
【问题描述】:

我能够执行分块的 XHR 请求,获取Range 标头指定的文件片段。然而,当使用单个 XHR 请求一次下载整个文件时,文件传输总是可能会更快,而不是使用各自的 XHR 请求实现获取的块。

我想知道的是,如果我开始直接下载,有没有办法在下载完成之前访问正在下载的二进制数据?有一个progress 处理程序,它报告当前下载的总大小和数量。有什么方法可以访问全部或部分已下载的数据?

基本上,在传输过程中,我需要能够将文件分成块并对其执行操作。我不能等到下载完成才能这样做。我还需要尽可能快的下载,这就是为什么分块机制不理想的原因,它似乎总是会变慢。

【问题讨论】:

    标签: javascript html xmlhttprequest blob


    【解决方案1】:

    您可以暂时使用xhr.responsexhr.responseText 获得回复。 它仅适用于文本数据。

    例子:

    var xhr = new XMLHttpRequest();
    xhr.addEventListener("progress", function (){  //could be .onprogress also
        console.log(xhr.response);
    });
    xhr.open(someMethod, someUrl);
    xhr.send();
    

    重要提示:.response 包含自上次进度事件以来加载的完整响应,而不是部分

    对于二进制数据,有moz-blobmoz-chunked-arraybuffer responseTypes,但没有标准化。

    【讨论】:

    • 这仅适用于文本,OP 询问了二进制数据。
    • 是的,我正在下载大量(几场)二进制数据。当我记录xhr.responsee.response 时(e 是在progress 回调处理程序期间传递的参数)。我分别得到nullundefined - 直到最后一次回调(当文件传输完成时),此时xhr.response 变为Blob。因此,它不适用于在传输过程中获取二进制数据。
    • @Musa,您为什么认为这仅适用于文本?我测试了机智图片
    • 您的示例使用文本,无论文件类型如何。将 responseType 设置为 blob 或 arraybuffer 以使用二进制数据。
    • 对我来说,在 Chrome 中只使用文本 responseType。尝试设置 blob 或 arraybuffer 时,xhr.response 未定义。
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2011-04-24
    • 2016-10-31
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多