为什么Javascript的XMLHttpRequest octet-stream MIME类型返回的响应是字符串?

4

我尝试使用XMLHttpRequest获取gltf二进制文件。这是我尝试的代码。

var xhr = new XMLHttpRequest();
xhr.open("GET","THE ADDRESS",true);
xhr.setRequestHeader("Accept", "application/octet-stream");
xhr.responseType = "arraybuffer";
xhr.onload = function (v) {
    resolve(xhr.response); // xhr.response must be ArrayBuffer but xhr.response is string
};
xhr.onerror = function (e) {
    reject(e);
};
xhr.send();

根据上述代码,我明确将responseType设置为 arraybuffer 。 但是当onload处理程序调用时, responseType 字段已更改为“”。
在此代码中我没有调用任何其他“XMLHttpRequest”。这是我得到的响应头。
accept-ranges:bytes
content-length:102040
content-type:application/octet-stream
date:Fri, 18 Nov 2016 09:30:13 GMT
etag:"582ec3ef-18e98"
last-modified:Fri, 18 Nov 2016 09:03:43 GMT
server:h2o/2.0.4
status:200

这是我发送的请求头。

:authority:localhost
:method:GET
:path:/gex/t90-01/Duck/Duck.bin
:scheme:https
accept:*/*
accept-encoding:gzip, deflate, sdch, br
accept-language:ja,en-US;q=0.8,en;q=0.6
cache-control:no-cache
pragma:no-cache
referer:https://localhost/gex/
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

有什么需要帮助的吗?

你如何验证数据类型?你使用 typeof 吗? - Álvaro González
我在检查器上进行了检查。我看到response字段被"包围,所以我认为它是字符串。 - kyasbal
1
我使用 typeof 进行了检查,但实际上它是字符串。 - kyasbal
@LimeStreem,您能尝试下面我的回答吗? - Aruna
1个回答

2

您可以尝试通过将setRequestHeader更改为以下内容来使用下面的代码。

此外,您应该在下面使用的resolve方法内正确处理xhr.response,并不确定您是否已经正确执行。

var xhr = new XMLHttpRequest();
xhr.open("GET","THE ADDRESS",true);
xhr.overrideMimeType("application/octet-stream");
//xhr.setRequestHeader("Accept", "application/octet-stream");
xhr.responseType = "arraybuffer";
xhr.onload = function (v) {
    resolve(xhr.response); // xhr.response must be ArrayBuffer but xhr.response is string
};
xhr.onerror = function (e) {
    reject(e);
};
xhr.send();

谢谢你友善地回答我的问题。但是,我需要向你道歉,因为这个问题的原因完全是我的问题。我发现我的朋友编写的库被用于这个项目中,重写了XMLHttpRequest类,并且重写的代码注入了responseType....不过,我真的很感谢你尝试帮助我。 - kyasbal
现在glb有自己的MIME类型:xhr.setRequestHeader("Accept", "model/gltf-binary"); - Dimitrios Ververidis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接