Blazor WASM размещен — как загрузить файл с помощью HttpPost

#https #blazor #blazor-webassembly

#https #blazor #blazor-webassembly

Вопрос:

У меня есть приложение, размещенное на Blazor WASM, которое имеет конечную точку API, которая принимает модель в теле. Затем контроллер преобразует свойства модели в PDF и возвращает FileStreamResult.

Поскольку у меня есть содержимое тела запроса, это должен быть метод HttpPost; однако я видел только примеры, которые используют HttpGet для вызова загрузки.

В нынешнем виде я получаю только двоичные данные pdf в содержимом ответа. Могу ли я запустить загрузку браузера с помощью этой настройки? Или мне нужно вручную преобразовать byte[] его в файл на клиенте?

Серверный контроллер:

 [HttpPost("DownloadPdf")]
public async Task<FileStreamResult> DownloadPdf(DownloadPdfModel model)
{
    try
    {
        var title = $"{model.Id}-{model.Description}";
        var filename = $"{title}.pdf";
        var doc = await _pdfService.HtmlToPdf(model.Html);

        return File(doc.Stream, "application/pdf", filename);
    }
    catch (Exception)
    {
        return null;
    }
}
  

Клиентский Http-сервис:

 public async Task DownloadPdf(DownloadPdfModel model)
{
    var content = new StringContent(JsonConvert.SerializeObject(model), System.Text.Encoding.UTF8, "application/json");

    using var response = await _httpClient.PostAsync("api/FooBar/DownloadPdf", content);

    response.EnsureSuccessStatusCode();

    var result = await response.Content.ReadAsStreamAsync();
    // Can I invoke the browser download here or manually using System.IO?
}
  

Ответ №1:

Вы можете использовать этот пакет: https://github.com/arivera12/BlazorDownloadFile . Вот пример кода, где HttpResponseMessage — это ответ от сервера, содержащий содержимое файла, и он «загружает» его в виде файла Excel в браузере, в моем случае.

             if (httpResponseMessage.IsSuccessStatusCode)
            {
                byte[] bytes = await httpResponseMessage.Content.ReadAsByteArrayAsync();

                await BlazorDownloadFileService.DownloadFile("filename.xlsx",
                    bytes,
                    contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            }
  

Комментарии:

1. это работает, но не идеально. я попытаюсь позже провести рефакторинг своего кода, чтобы отобразить строку html в api вместо клиента