Подтвердить что ты не робот

AngularJS: двоичные данные PUT от ArrayBuffer на сервер

Хорошо, поэтому я пытаюсь прочитать файл PDF следующим образом:

reader.readAsArrayBuffer(file);

а затем попробуйте отправить его на сервер с помощью $http следующим образом:

$http.put(url, data, {headers: {'Content-Type': 'application/pdf'}});

Итак, просто прочитайте и отправьте двоичный файл на сервер в необработанном виде. Согласно некоторым ресурсам, которые я нашел, передача ArrayBuffer в XHR должна работать, но передача его как данных в $http приводит к запросу body следующим образом: {} и Content-Length=2

Чтение файла readAsBinaryString() приводит к поврежденному файлу (и по этой причине, по-видимому, не рекомендуется)

Случай использования кажется мне настолько тривиальным, я чего-то не хватает?

Chrome 36, Angular 1.2.20

4b9b3361

Ответ 1

Вы должны использовать reader.readAsArrayBuffer(file);, а затем в обратном вызове onload создать ArrayBufferView из результата:

new Uint8Array(reader.result)

передать эти данные в $http и перезаписать свойство transformRequest, поэтому angularjs не кодирует ваш массив в json:

reader.onload = function() {
    $http({
        method: 'PUT', 
        headers: {'Content-Type': 'application/pdf'}, 
        data: new Uint8Array(reader.result), 
        transformRequest: []
    })
};
reader.readAsArrayBuffer(file);

Ответ 2

Это потому, что вы просто передаете метод $http в буфер массива вместо того, чтобы записывать этот буфер в массив байтов? Если это так, то вы отправляете на сервер, вероятно, просто объект arraybuffer.

Отметьте это сообщение о том, как написать массив ArrayBuffer в байтовый массив: Как читать двоичные данные в массив байтов в Javascript?

Ответ 3

В запросе есть две проблемы.

  • Вам необходимо предоставить представление данных для функции $http.

Итак, data должен быть new DataView(data) или new Uint8Array(data) и т.д.

  1. $http всегда пытается отправить данные как json. Это можно предотвратить, если вы переопределите функцию преобразования. Функция преобразования - это агент, который отвечает за преобразование вашего двоичного кода в json.

Итак, вы должны добавить свойство transformRequest: [] к вашему запросу.

Пример:

var request = $http({
                        method: 'PUT',
                        url: 'example.com',
                        data: new Uint8Array(data),
                        headers: {'Content-Type': 'application/octet-stream'},  
                        transformRequest: [],
                        responseType: 'arraybuffer'
                    });