我制作了XmlHttpRequest
,以将二进制文件下载为ArrayBuffer
:
async function downloadBinaryFile(fileName : string) : Promise<ArrayBuffer> {
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open('GET', `someFolder/${fileName}`, true);
request.responseType = 'arraybuffer';
request.onload = function(event) {
const arrayBuffer = request.response;
if (arrayBuffer)
resolve(arrayBuffer)
else
reject('empty array buffer');
};
request.onerror = reject;
request.send();
});
}
这在大多数情况下都有效。这意味着它可以对我尝试过的所有外部二进制文件可靠地起作用,但不适用于我自己创建的文件。这表明问题出在我的文件上,但是我可以通过Postman请求这些文件,并且它们可以很好地上传到可以使用它们的外部网站上。所以问题也不应该是我的文件。
这些ArrayBuffers
的内容应该是72个float
值(代表一个立方体的24个顶点)和36个unsigned short
值(代表12个索引)。这些值以某种方式保留了一定的模式,因此它们不是完全随机的,但是我看不出出了什么问题。缓冲区的大小也完全不切实际,例如288字节文件的216840字节。例如:
[-0.5, -0.5, 0.5,
0.5, -0.5, 0.5,
-0.5, 0.5, 0.5,
... ]
成为
[-0.800000011920929, 0, 0,
-0.5666700005531311, 0, 0,
-0.3957499861717224, 0, 0,
... ]
老实说,我被困住了。这不是字节序的问题,我可以使用邮递员为文件请求与XHR中相同的URL,并接收正确的文件,并且相同的代码适用于其他文件。还有什么可能是错的?
(出于完整性考虑:此文件已在Chrome 74上进行了测试,并且文件在Windows上使用Nginx 1.16.0提供)