У меня есть служба 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-объекта, и ничего из этого не помогает.
Мне кажется, я что-то напутал в типе контента и создании блоба, но не смог понять, что не так. Любая помощь?