我正在尝试下载一个只包含一个非常长的逗号分隔字符串的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.
});
但是,当我检查网络响应时,似乎根本没有返回任何内容。我做错了什么?
(朋友建议将文件存储在服务器中,然后下载。由于种种原因,我不允许这样做。)
答案 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", "");
将提示用户保存文件。