【问题标题】:How to download a file from blazor server side如何从 blazor 服务器端下载文件
【发布时间】:2019-12-11 03:19:12
【问题描述】:

我有一个服务器端 Blazor 应用程序,它构建了大量数据,当用户单击按钮时,将使用该数据生成一个 Excel 文件。所有这些工作正常。但我的问题是下载该内存文件的适当方法是什么?我知道我可以将它保存到网络服务器磁盘并执行重定向或类似的操作来下载它我宁愿不必将文件保存到磁盘,如果我不需要的话。

【问题讨论】:

    标签: blazor blazor-server-side


    【解决方案1】:

    我最终使用的解决方案是 JS Interop 重定向到然后下载的文件。

    public async Task DownloadFileAsync(string path)
    {
        await Js.InvokeAsync<string>("downloadFile", path);
    }
    
    // In JS
    function downloadFile(filename) {
        location.href = '/api/downloads/' + filename;
    }
    

    【讨论】:

    【解决方案2】:

    你可以这样做

    [Route("api/[controller]"]
    [ApiController]
    public class DownloadController : ControllerBase
    {
        [HttpGet, DisableRequestSizeLimit]
        public async Task<IActionResult> Download()
        {
            var memory = new MemoryStream();
            await using(var stream = new FileStream(@"pathToLocalFile", FileMode.Open))
            {
                await stream.CopyToAsync(memory);
            }
            memory.Position = 0;
            //set correct content type here
            return File(memory, "application/octet-stream", "fileNameToBeUsedForSave");
        }
    }
    

    在剃刀的一面

    <button @onclick="onClick">download</button>
    
    @code {
    
       private async Task onClick(MouseEventArgs e)
       {
            NavigationManager.NavigateTo("api/download", true);
       }
    }
    

    【讨论】:

    • 跳过使用 MemoryStream 可能是一种改进 - 使用 FileStream(它是一个 Stream)将文件读入内存然后将 MemoryStream 返回 0 并将其发送到需要 Stream (即 FileStream )的方法 - 只需使用 FileStream 为 Stream 参数声明 File。如果它是一个 500Mb 的文件,您将燃烧 500Mb 的内存以将其加载到 MemoryStream 中,并且在将 256 字节数组翻倍以读取 512Mb 并在每次翻倍时复制所有字节时会花费一卡车更多的资源。 /跨度>
    • 问题是关于 Blazor 服务器端而不是组装
    • 虽然这个提议的解决方案试图解决流式传输文件的问题,但它没有解决断言文件已经在内存中(生成)的问题。我认为@CaiusJard 虽然准确地了解了内存的使用情况,但对细节很感兴趣,错过了更简单的一点。我相信建议的解决方案只是错过了建议您将文件保存到磁盘以便从 HTTP 请求访问它,否则您必须找到一种方法将生成的文件存储在内存中,以便您可以识别它并访问它来自 HTTP 请求。它也应该在一段时间后变得陈旧并丢弃。
    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多