有没有办法让文件流下载到 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 中的浏览器?的主要内容,如果未能解决你的问题,请参考以下文章