Быстрая загрузка BLOB-объектов

Я использую этот код для загрузки файлов с моего веб-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 позволит браузеру оценить время загрузки.

Если вас устраивает собственное решение, рекомендуется ответить на свой вопрос.

Bennett Hardwick 25.12.2018 09:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
159
1

Ответы 1

В случае, если вам нужно было загрузить ответ на запрос POST или ваш запрос требует некоторой расширенной аутентификации, вместо использования библиотеки axios вы можете попробовать использовать собственный метод fetch.

fetch(options)
  .then(res => res.blob())
  .then(blob => {
    // use blob
  });

Вы можете просмотреть полный response API здесь.

Другие вопросы по теме