我正在开发一个Web应用程序,其中经过身份验证的用户可以创建一个事件并发送该事件的邀请。
其中一个要求是我添加了一个按钮,活动组织者可以点击该按钮以允许他/她下载所有发送的邀请的excel / OOXML报告。
视图和实际的按钮单击事件都存在于一个“Web”项目中,该项目在ASP.NET MVC 4上运行,并且主要使用纯HTML和AngularJs作为平台。
我还有一个由BLL,DAL等支持的API项目.API是.NET MVC WebAPI,它是通过此端点提供的电子表格:
/// <summary>GET api/ExportInvitations/{id}</summary>
/// <summary>Gets an OOXML invitation report by event id.</summary>
public HttpResponseMessage Get(int id)
{
var wb = Invitation.ConstructInvitationSpreadsheet(id);
var result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new MemoryStream();
wb.SaveAs(stream);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "HelloWorld.xlsx" };
return result;
}
在前端,我使用这个AngularJS脚本来调用构建并返回电子表格的API端点(为了简洁起见,我总结了这段代码):
$http.get('/api/ExportInvitations/' + id).success(function(data) {
//do stuff
});
一切似乎都能正常运行,用户应该看到电子表格在浏览器中显示为下载。对API的ajax调用很好,API会返回一个电子表格 - 我从来没有看到该文件在我的浏览器底部显示为下载(我使用的是Chrome)。
感谢任何帮助。
答案 0 :(得分:3)
在发布此内容后不久,我在另一个SO post找到了答案:
您无法通过ajax本身下载,只需重置窗口的位置即可。所以,而不是:
$http.get('/api/ExportInvitations/' + id).success(function(data) {
//do stuff
});
我只需要这个:
window.location = '/api/ExportInvitations/' + id;
这会触发下载而不会实际更改浏览器中的URL。