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实现下载:
- 首先在前端页面的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); }
- 修改你的@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); }
- 给按钮绑定点击事件即可:
<button @onclick="HandleDownload">下载MSG文件</button>
内容的提问来源于stack exchange,提问作者justinmalyn
相关产品推荐
相关产品推荐

