xmlhttprequest - 为什么我们在使用 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");
解决方案
您的问题让我意识到我并不完全确定以下内容,但这是我一直以来的看法。
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()
)。
推荐阅读
- javascript - ReactJS - 警告消息'Hook useEffect 缺少依赖项'
- macos - macOS,通过拖动更改视图控制器的大小
- spring-boot - 无法使用 Axios 执行从 Vue 应用程序到 spring-boot 后端的跨域请求
- google-cloud-platform - Google DataPrep - 显然有限的表格大小
- reactjs - 在 Chrome DevTools 中分析 React 应用程序 - 不支持分析
- javascript - 如何在开发模式下使用 parcel.js 运行 eslint
- ruby-on-rails - Rspec 在 Rails 中测试强参数不起作用(参数数量错误)
- java - 如何将可变参数存储在 List 或 ArrayList 中
- .net - 当两个任务中的任何一个完成时,需要在我的 Form 类中调用一个方法
- android - 如何将通知从手机发送到通过 BLE 连接的设备