如何从 Blazor 服务器端下载文件
How to download a file from blazor server side
我有一个服务器端 blazor 应用程序,它构建了大量数据,当用户单击一个按钮时,将使用该数据生成一个 excel 文件。所有这些都工作正常。但我的问题是下载该内存文件的合适方法是什么?我知道我可以将它保存到 Web 服务器磁盘并进行重定向或类似的操作来下载它如果不需要,我宁愿不必将文件保存到磁盘。
我最终使用的解决方案是 JS Interop 重定向到然后下载它的文件。
public async Task DownloadFileAsync(string path)
{
await Js.InvokeAsync<string>("downloadFile", path);
}
// In JS
function downloadFile(filename) {
location.href = '/api/downloads/' + filename;
}
你可以这样做
[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);
}
}
我有一个服务器端 blazor 应用程序,它构建了大量数据,当用户单击一个按钮时,将使用该数据生成一个 excel 文件。所有这些都工作正常。但我的问题是下载该内存文件的合适方法是什么?我知道我可以将它保存到 Web 服务器磁盘并进行重定向或类似的操作来下载它如果不需要,我宁愿不必将文件保存到磁盘。
我最终使用的解决方案是 JS Interop 重定向到然后下载它的文件。
public async Task DownloadFileAsync(string path)
{
await Js.InvokeAsync<string>("downloadFile", path);
}
// In JS
function downloadFile(filename) {
location.href = '/api/downloads/' + filename;
}
你可以这样做
[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);
}
}