Самый простой способ - не использовать fetch
, а использовать обычный элемент ссылки:
<a href="/api/download" download="sample.json">Click to download</a>
Во всех современных браузерах этот атрибут download
заставит браузер сохранить ответ ссылки в видефайл. Не требуется fetch
.
Однако, если вам абсолютно необходима операция fetch
, тогда вы можете сделать это в самом JS: получить свой результат, затем создать <a>
, установить его href
атрибут файлового блоба и убедитесь, что атрибут download
установлен:
fetch(...)
.then(res => res.blob())
.then(blob => {
const blobURL = URL.createObjectURL(blob);
// create our <a> to force a download for the response
const dl = document.createElement(`a`);
dl.href = blobURL;
dl.download = `sample.json`;
// In order for the link to "trigger" we need to add it to the document.
// If we don't, dl.click() won't do anything. So add it, click it, then remove it.
dl.style.display = `none`;
document.body.appendChild(dl);
dl.click();
document.body.removeChild(dl);
});