使用AngularJS或JavaScript,如何通过ajax下载文件?

时间:2014-03-07 13:37:33

标签: asp.net-mvc angularjs asp.net-web-api

背景

我正在开发一个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)。

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

在发布此内容后不久,我在另一个SO post找到了答案:

您无法通过ajax本身下载,只需重置窗口的位置即可。所以,而不是:

 $http.get('/api/ExportInvitations/' + id).success(function(data) {
                    //do stuff
                });

我只需要这个:

window.location = '/api/ExportInvitations/' + id;

这会触发下载而不会实际更改浏览器中的URL。