Blazor WASM托管-如何使用HttpPost下载文件

时间:2020-09-25 20:28:57

标签: 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 个答案:

答案 0 :(得分:0)

您可以使用以下软件包: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");
            }