JavaScript fetch: скачать файл через Blob и сохранить локально

Категория: JavaScript · Язык: JavaScript · Обновлено:

Когда API возвращает файл через fetch, ответ можно преобразовать в Blob и запустить скачивание временной ссылкой. Такой подход подходит для небольших и средних файлов, если сервер разрешает запрос и браузер получает корректные заголовки.

Рабочий пример

JavaScript
async function downloadFile(url, filename) {
  const response = await fetch(url);
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
  const blob = await response.blob();
  const link = document.createElement('a');
  link.href = URL.createObjectURL(blob);
  link.download = filename;
  link.click();
  setTimeout(() => URL.revokeObjectURL(link.href), 1000);
}

Проверка response.ok не позволяет сохранить HTML-страницу ошибки под именем файла. Временный object URL следует освободить после запуска загрузки.

Частый вопрос

Почему файл открывается вместо скачивания?

Проверьте атрибут download, имя файла и CORS. Для cross-origin URL браузер может игнорировать download; в таком случае настройте Content-Disposition на сервере.