下载文件时,我应该从.NET控制器返回到AngularJS?

时间:2016-03-18 00:23:51

标签: .net angularjs asp.net-mvc

我正在尝试下载一个只包含一个非常长的逗号分隔字符串的CSV模板。我的API端点完全如此:

public HttpResponse DownloadTemplate()
{
    var attachment = "attachment; filename=template.csv";
    var headers = "Header1,Header2,Header3,HeaderAndSoOnAndSoForth";

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.AddHeader("Content-Disposition", attachment);
    HttpContext.Current.Response.ContentType = "text/csv";
    HttpContext.Current.Response.AddHeader("Pragma", "public");
    HttpContext.Current.Response.Write(headers);

    return HttpContext.Current.Response;
}

这是由简单的AngularJS $http.post请求调用的:

$http.post('api/Files/DownloadTemplate').success(function (data) {
    // Do something with data.
});

但是,当我检查网络响应时,似乎根本没有返回任何内容。我做错了什么?

(朋友建议将文件存储在服务器中,然后下载。由于种种原因,我不允许这样做。)

1 个答案:

答案 0 :(得分:1)

我有点想知道为什么你不只是返回字符串,因为你正在$http.post中立即处理数据。所以也许这个答案不适用,但我会发布它,因为它花了我一段时间来弄清楚它是否相关然后很棒。

但是,如果我们正在谈论真正的文件下载,我已经在Angular中实现了它,使用以下技术调用我的WebAPI:

public HttpResponseMessage DownloadFile()
{
    var content = DoSomeProcessingToGetContentAsByteArray();

    var result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        // Haven't checked, but there may be a StringContent() instead?
        Content = new ByteArrayContent(content)
    };

    result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = "template.csv"
    };

    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

    return result;
}

然后来自Angular:

window.open("http://whatever/api/Files/DownloadTemplate", "_blank", "");

将提示用户保存文件。