有没有办法让文件流下载到 Blazor 中的浏览器?

Posted

技术标签:

【中文标题】有没有办法让文件流下载到 Blazor 中的浏览器?【英文标题】:Is there a way to get a file stream to download to the browser in Blazor? 【发布时间】:2020-02-19 23:30:25 【问题描述】:

我正在尝试使用 Blazor 做一些事情,但我还是新手。我正在尝试将文件流下载到浏览器。将文件从 Blazor 下载到浏览器的最佳方式是什么?

我尝试在我的 razor 视图中使用一种方法,该方法返回一个流,但没有奏效。

//In my Blazor view
@code
    private FileStream Download()
    
        //get path + file name
        var file = @"c:\path\to\my\file\test.txt";
        var stream = new FileStream(test, FileMode.OpenOrCreate);
        return stream;
    

上面的代码没有给我任何东西,甚至没有错误

【问题讨论】:

您想从服务器下载文件到客户端是否正确?或者您想上传文件进行处理,例如上传图片? 我的服务器(A)正在向另一台服务器(B)发送请求以获取文件,然后将其提供给浏览器,至少我希望它是这样工作的。我正在向另一个资源发出网络请求,我希望它触发浏览器下载 我的意思是。 . .为什么不让用户直接从服务器(B)下载? 【参考方案1】:

虽然上面的答案在技术上是正确的,但是如果你需要传入一个模型-POST-,那么NavigationManager 就不起作用了。在这种情况下,您可能最终会使用HttpClient 组件。如果是这样,将 response.Content -your stream- 包装在 DotNetStreamReference 实例中 - new DotNetStreamReference(response.Content)。这将创建一个ReadableStream。然后使用内容创建 blob。请记住,DotNetStreamReference 最近是在 .NET 6 RC1 中引入的。目前为止最有效的方法。否则,您可以使用 fetch API 并从响应中创建一个 blob。

【讨论】:

【参考方案2】:

另一个解决方案是使用endpoints.MapControllerRoute 添加一个简单的 api 控制器端点。不过,这仅适用于服务器端 blazor。

例如:

endpoints.MapBlazorHub();
endpoints.MapControllerRoute("mvc", "controller/action");
endpoints.MapFallbackToPage("/_Host");

然后添加一个控制器。例如:

public class InvoiceController : Controller

    [HttpGet("~/invoice/sessionId")]
    public async Task<IActionResult> Invoice(string sessionId, CancellationToken cancel)
    
        return File(...);
    

在 .razor 文件中的用法:

async Task GetInvoice()

    ...
    Navigation.NavigateTo($"/invoice/orderSessionId", true);

【讨论】:

以上是关于有没有办法让文件流下载到 Blazor 中的浏览器?的主要内容,如果未能解决你的问题,请参考以下文章

Blazor 拖放上传文件转换格式并推送到浏览器下载

Blazor:在 Razor 文件中定义命名空间

有没有办法通过单击触发 Blazor 中的两个连续事件?

有没有办法强制使用SoundCloud javascript流API的MP3块?

IIS 中的 Blazor 服务器端下载问题

通过httpClient请求文件流(普通文件和压缩文件)示例