【问题标题】:How to download in-memory file from Blazor server-side如何从 Blazor 服务器端下载内存文件
【发布时间】:2020-04-23 01:35:32
【问题描述】:

有没有办法下载文件,在 Blazor 服务器端 中动态生成在内存中,而无需将其存储在文件系统上?

【问题讨论】:

  • 我认为 Blazor 中没有内置任何东西,但您可以添加 MVC 控制器并在那里生成文件。所以构造一个带有参数的 URL 来做到这一点。但是考虑一下是否可以利用它。
  • Henk,是的,好的方法是将 MVC 控制器添加到 Blazor 服务器端应用程序中。不幸的是,在网络上搜索到的大多数建议都是关于将 Blazor 添加到现有 MVC 中 - 反之亦然。

标签: file download blazor blazor-server-side


【解决方案1】:

解决方案是将 Web Api 控制器添加到 Blazor 服务器端应用程序中。

  1. 将 Controllers/DownloadController.cs 控制器添加到 Blazor 应用的根目录:
[ApiController, Route("api/[controller]")]
    public class DownloadController : ControllerBase {

        [HttpGet, Route("{name}")]
        public ActionResult Get(string name) {

            var buffer = Encoding.UTF8.GetBytes("Hello! Content is here.");
            var stream = new MemoryStream(buffer);
            //var stream = new FileStream(filename);

            var result = new FileStreamResult(stream, "text/plain");
            result.FileDownloadName = "test.txt";
            return result;
        }


    }
  1. 调整 Blazor 应用的 Startup.cs 以支持控制器路由:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {

            ...

            app.UseRouting();

            app.UseEndpoints(endpoints => {

                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller}/{action}");

                endpoints.MapControllers();

                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");

            });

        }

【讨论】:

  • 谢谢,效果很好,再简单不过了。然而,一个恼人的事情是下载 web api url 显然会显示在地址栏上,而当使用基于 javascript 的下载例程或仅在下载具有下载属性的普通 a/href 文件时可以避免这种情况(如见于w3schools.com/tags/att_a_download.asp)。不知道如何在没有 JS 互操作的情况下解决这个问题。
  • 使用 JS-interop 很容易避免上述问题,如此处所述; syncfusion.com/kb/10358/…
  • Blazor 服务器端不应该有控制器
  • @MarchalPT - 为什么不应该这样做?你有那个链接吗? [需要引用]
  • @HenkHolterman 首先,您可以在没有 api 的情况下使用 cshtml 页面进行下载,当然您可以为特定端点添加 API,但 Blazor 服务器的重点是在服务器中运行所有代码。
【解决方案2】:

在 Blazor 中创建一个 cshtml 页面,如下所示。

文件下载.cshtml.cs:

public class FileDownloadsModel : PageModel
{        
    public async Task<IActionResult> OnGet()
    {
        byte[] fileContent = ....;                                  

        return File(fileContent, "application/force-download", "test.txt");
    }       
}

文件下载.cshtml:

@page "/download/{object}/{id:int}/{fileType}" 
@model GFProdMan.Pages.FileDownloadsModel

就是这样。

【讨论】:

  • 你知道cshtml(Razor Pages)是一个轻量级的Controller模型吗?
  • 不需要附加API
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
相关资源
最近更新 更多