Сохранение файла XLSX с сервера HTTP API через Javascript - PullRequest
0 голосов
/ 28 августа 2018

У меня есть служба http, которая возвращает HTTP-ответ типа

Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

и если я вызываю этот HTTP-сервис из curl и redirect, я получаю файл .xlsx, воссозданный правильно. Однако попытка сохранить файл из JavaScript не удается. Код, который я использую:

Curl:

$ curl -v -X POST <API_ENDPOINT> > a.xlsx ;# a.xlsx works fine

Javascript:

$http.post(<API_ENDPOINT>).then(function(response) {
          console.log(response);
          downloadFile(response.data, "b.xlsx")
});

var downloadFile = function(responseData, fileName) {
      var blob = new Blob([responseData], {
        type: 'application/vnd.ms-excel'
      });

      if (window.navigator.msSaveOrOpenBlob) {
          window.navigator.msSaveBlob(blob, fileName);
      } else {
        var a = document.createElement('a');
        var url = window.URL.createObjectURL(blob);

        document.body.appendChild(a);
        a.style = 'display: none';
        a.href = url;
        a.download = fileName;
        a.click();
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);
      }
};

Файл сохранен, однако содержимое, похоже, отличается от curl, даже если сервер отправляет тот же файл.

Значение заголовка content-length одинаково для обоих ответов (curl и javascript (записано с помощью chrome devtools)), но размер файла при перенаправлении через curl составляет 5.1k (почти то же самое, что и значение content-length), но размер файла, созданного с помощью js, равен 8,5 КБ и является неправильным.

Я пытался установить application/octet-stream, octet/stream, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet при создании BLOB-объекта, и ничего из этого не помогает.

Мне кажется, я что-то напутал в типе контента и создании блоба, но не смог понять, что не так. Любая помощь?

1 Ответ

0 голосов
/ 28 августа 2018

Я понял проблему. Методу $ http.post требуется установить другой параметр, если тип ответа будет двоичным. Изменение, которое я должен был сделать:

$http.post(<API_ENDPOINT>, null, {responseType: 'arraybuffer'});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...