首页 > 解决方案 > 为什么我们在使用 XMLHttpRequest 时必须设置 responseType?

问题描述

我实现了一个上传文件的 HTML,然后从服务器下载另一个文件。在处理“下载部分”时,我注意到如果我下载二进制文件,我必须设置responseType为,blob否则文件将被破坏。

让我感到困惑的是,HTTP 标头包含content-type的内容可以告诉XMLHttpRequest服务器正在发送什么类型的文件。为什么我必须手动设置?我不明白逻辑,因为轮到服务器来告诉文件类型是什么,而不是由客户端预测

        const xhr = new XMLHttpRequest();
        xhr.responseType = 'blob'

.......

        xhr.onload = function(e) {
          if (this.status == 200) {

          var blob = new Blob([this.response]); // if i don't set responseType, this.response will be broken
          let a = document.createElement("a");

标签: xmlhttprequest

解决方案


您的问题让我意识到我并不完全确定以下内容,但这是我一直以来的看法。

responseType设置的类型,xhr.response以便您可以将其处理Blob; 它使您可以将请求的结果xhr作为Blob. 如果你不设置它,xhr.response将是文本。

服务器可能已经根据 MIME 类型以正确的方式发送数据,但它仍然只发送具有 MIME 类型的字节流;接收到的字节的解释取决于你自己,接收到的数据不会自动属于Blob基于 mime 类型的类型。

Blob不是服务器上的文件类型;服务器可能知道并发送文件的 mime 类型,但Blob不是其中之一,并且xhr.response不会是 aBlob仅仅因为 mime 类型表明 aBlob将是正确的类型。

此外,您可能希望处理xhr.response不同于从 mime 类型推断的内容,从这个意义上说,它是一种覆盖(尽管与 的功能不同xhr.overrideMimeType())。


推荐阅读