Как отправить PDF-файл, загружаемый с сервера, в область загрузки браузера, а не открывать его в окне браузера?
Я работаю с С# в Blazor. Это мой текущий код, который мне нужно изменить, но я не знаю, как это сделать (я погуглил, прежде чем спросить здесь):
async void DownloadDocument(string apiURL, Guid ID)
{
JSRuntime.InvokeAsync<string>("open", $"{apiURL}/GetPDF/{ID}", "_blank");
}
Здесь сервер возвращает FileStreamResult, а браузер показывает файл на новой вкладке. Я хочу, чтобы вместо этого он отправил его в папку загрузок.
Отвечает ли это на ваш вопрос? Принудительная загрузка файла на веб-сервер - ASP .NET C#



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


Вы вызываете функцию JS под названием «открыть» с двумя параметрами. (https://developer.mozilla.org/en-US/docs/Web/API/Window/open)
Попробуйте создать свою собственную функцию загрузки JS внутри файла/тега скрипта и вызвать ее.
Важнейшей частью сохранения файла в папке загрузок является установка атрибута download тега a.
Это может выглядеть примерно так.
внутри wwwroot/index.html:
<script>
window.downloadFile = (fileName, pdfData) => {
const linkSource = `data:application/pdf;base64,${pdfData}`;
const downloadLink = document.createElement("a");
downloadLink.href = linkSource;
downloadLink.download = fileName;
downloadLink.click();
downloadLink.remove();
}
</script>
и в вашем компоненте blazor:
async void DownloadDocument(string apiURL, Guid ID)
{
// call your api to download the file you want to download
var response = await Http.GetAsync($"{apiURL}/GetPDF/{ID}"));
// convert to base64
var pdfExportBytes = await response.Content.ReadAsByteArrayAsync();
var pdfExportB64 = Convert.ToBase64String(pdfExportBytes);
// invoke js download
await JSRuntime.InvokeVoidAsync("downloadFile", "FileName", pdfExportB64);
}
Файл по-прежнему будет открыт, если это настроено в браузере пользователя, но он также будет сохранен в папке загрузки.
Вы не можете контролировать это. Это настройки для каждого браузера. Одни могут открывать PDF в браузерах, другие нет