You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Razor客户端如何下载Controller返回的.msg文件且无需服务端存储

你现有Controller的返回逻辑已经符合要求,不需要调整,返回的File结果是直接输出内存字节流,不会在服务端存储文件。

前端的修改分两种场景,按需选择:

场景1:接口不需要额外自定义请求头(比如不需要传token、权限校验走cookie)

直接用原生a标签实现即可,不需要写任何C#请求逻辑,razor代码如下:

<a href="你的接口路由地址" download="blahblah.msg" class="btn btn-primary">下载MSG文件</a>

浏览器点击a标签会自动识别后端返回的文件流,触发下载,全程不需要服务端存储文件。


场景2:接口需要传自定义请求头(比如Authorization token)

需要修改你的异步请求逻辑,配合JS实现下载:

  1. 首先在前端页面的JS全局作用域中添加下载工具方法:
function triggerMsgDownload(fileName, fileBytes) {
    const blob = new Blob([fileBytes], { type: 'application/vnd.ms-outlook' });
    const downloadUrl = URL.createObjectURL(blob);
    const tempLink = document.createElement('a');
    tempLink.href = downloadUrl;
    tempLink.download = fileName;
    document.body.appendChild(tempLink);
    tempLink.click();
    // 清理临时资源
    document.body.removeChild(tempLink);
    URL.revokeObjectURL(downloadUrl);
}
  1. 修改你的@code块中的请求逻辑,同时注入IJSRuntime调用JS方法:
// 注入依赖
[Inject] private HttpClient Http { get; set; }
[Inject] private IJSRuntime JsRuntime { get; set; }

// 按钮点击事件绑定的方法
private async Task HandleDownload()
{
    var response = await Http.GetAsync("你的接口路由地址");
    // 校验请求是否成功
    response.EnsureSuccessStatusCode();
    // 读取响应的字节流
    var fileContent = await response.Content.ReadAsByteArrayAsync();
    // 调用JS触发下载
    await JsRuntime.InvokeVoidAsync("triggerMsgDownload", "blahblah.msg", fileContent);
}
  1. 给按钮绑定点击事件即可:
<button @onclick="HandleDownload">下载MSG文件</button>

内容的提问来源于stack exchange,提问作者justinmalyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:54:01