XmlHttpRequest запрос ArrayBuffer приводит к мусору - PullRequest
1 голос
/ 15 июня 2019

Я делаю 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 индексов).Значения каким-то образом сохраняют определенный шаблон, поэтому они не являются полностью случайными, но я не вижу, что идет не так.Буферы также имеют совершенно нереальные размеры, такие как 216840 байт для 288-байтового файла.Например:

[-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,
 ... ]

Я честно застрял.Это не проблема порядка байтов, я могу запросить тот же URL для файла, что и в XHR с почтальоном, и получить правильный файл, и тот же код работает для других файлов.В чем еще может быть ошибка?

(ради полноты: это было проверено на Chrome 74, а файлы обслуживались с использованием Nginx 1.16.0 в Windows)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...