如何从 Blazor 服务器端下载内存文件
How to download in-memory file from Blazor server-side
有没有办法下载 内存中 Blazor 服务器端[=15] 中动态生成的文件=] 无需将其存储在文件系统上?
解决方案是将 Web Api 控制器添加到 Blazor 服务器端应用程序中。
- 将
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;
}
}
- 调整
Startup.cs
Blazor 应用以支持控制器路由:
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");
});
}
像下面这样在 Blazor 中创建一个 cshtml 页面。
FileDownload.cshtml.cs:
public class FileDownloadsModel : PageModel
{
public async Task<IActionResult> OnGet()
{
byte[] fileContent = ....;
return File(fileContent, "application/force-download", "test.txt");
}
}
FileDownload.cshtml:
@page "/download/{object}/{id:int}/{fileType}"
@model GFProdMan.Pages.FileDownloadsModel
仅此而已。
有没有办法下载 内存中 Blazor 服务器端[=15] 中动态生成的文件=] 无需将其存储在文件系统上?
解决方案是将 Web Api 控制器添加到 Blazor 服务器端应用程序中。
- 将
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;
}
}
- 调整
Startup.cs
Blazor 应用以支持控制器路由:
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");
});
}
像下面这样在 Blazor 中创建一个 cshtml 页面。
FileDownload.cshtml.cs:
public class FileDownloadsModel : PageModel
{
public async Task<IActionResult> OnGet()
{
byte[] fileContent = ....;
return File(fileContent, "application/force-download", "test.txt");
}
}
FileDownload.cshtml:
@page "/download/{object}/{id:int}/{fileType}"
@model GFProdMan.Pages.FileDownloadsModel
仅此而已。