Я использую этот код для загрузки файлов с моего веб-API:
function download(name){
axios.get(api + "?filename = "+name, { responseType: 'blob' })
.then(res => {
let blob = new Blob([res.data]);
let a = document.createElement("a");
document.body.appendChild(a);
a.href = window.URL.createObjectUrl(blob);
a.download = name;
a.click();
window.URL.revokeObjectUrl(url);
a.remove();
}
);
}
При загрузке небольших файлов этот код хорош, но при загрузке больших файлов (например 400 МБ) код ожидает, пока большой двоичный объект прочитает все содержимое, и только затем «запускает загрузку» в диспетчере загрузки Chrome, что очень неинтуитивно для клиента.
Есть ли способ «передать» большой двоичный объект в файловую систему? вместо того, чтобы ждать, пока файл полностью поступит в оперативную память моего клиента, и только потом отображать загрузку в диспетчере загрузок?
Решено
Вместо того, чтобы загружать файл через библиотеку axios, я просто ссылаюсь в браузере на ссылку для загрузки, поскольку это просто запрос GET.
function download(name){
let a = document.createElement("a");
document.body.appendChild(a);
a.href = api + "?filename = "+name;
a.click();
a.remove();
}
Просто нужно установить заголовок ContentDisposition на стороне сервера для вложения, а также указать имя файла, поскольку атрибут загрузки почему-то не работает с этим методом.
Также указание ContentLength позволит браузеру оценить время загрузки.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В случае, если вам нужно было загрузить ответ на запрос POST или ваш запрос требует некоторой расширенной аутентификации, вместо использования библиотеки axios вы можете попробовать использовать собственный метод fetch.
fetch(options)
.then(res => res.blob())
.then(blob => {
// use blob
});
Вы можете просмотреть полный response API здесь.
Если вас устраивает собственное решение, рекомендуется ответить на свой вопрос.