Web API返回csv文件
Web API返回csv文件
我需要从Web API控制器获取一个csv文件。我无法弹出“另存为”对话框。页面上只显示文本输出。我尝试过使用jquery调用导出,也试过使用普通的html。控制器代码如下:
[System.Web.Http.HttpGet] public HttpResponseMessage Export() { StringBuilder sb = new StringBuilder(); IEnumerablelist = this.subscriberRepository.GetSubscribers(); foreach (CustomerDiscount item in list) { sb.AppendFormat( "{0};{1};{2};", item.CustomerName, item.CustomerNumber, Environment.NewLine); } MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(sb.ToString()); writer.Flush(); stream.Position = 0; HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" }; return result; }
编辑:
添加了这行代码:
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" };
仍然不起作用
我这样调用它:
Export
也试过这样调用它:
$("#export").click(function () { $.post("/Relay/Billing/Export", { type: $("#discountType").val() }) .done(function (data) { }); });
仍然没有显示"另存为"对话框。
问题:
通过AJAX调用API时,无法弹出下载对话框。
原因:
通过AJAX调用API时,无法直接弹出下载对话框。AJAX是一种异步请求方式,无法直接处理文件下载的响应。
解决方法:
1. 如果API使用GET方法,可以将API调用改为普通的链接形式,例如使用``标签:
click here
2. 如果需要使用POST方法,并且希望弹出下载对话框,可以使用普通的表单提交,并设置`target="_blank"`属性,将响应结果在新窗口中打开:
通过以上方法,即可解决通过AJAX调用API时无法弹出下载对话框的问题。
问题原因:通过Web API返回CSV文件时,打开了一个新的浏览器窗口,而不是弹出保存对话框。
解决方法:检查浏览器设置,确保没有阻止弹出保存对话框的设置。另外,可以使用以下方法来解决该问题:
1. 在API的Action中,将数据写入内存流(MemoryStream)而不是响应流(Response Stream)。
2. 创建一个HttpResponseMessage对象,并将内存流作为内容(Content)。
3. 设置HttpResponseMessage对象的内容类型(Content Type)为"text/csv",并设置内容描述(Content Disposition)为附件(attachment),指定文件名为"Export.csv"。
4. 返回HttpResponseMessage对象。
下面是一个示例代码:
HTML页面:
Export
API的Action:
public HttpResponseMessage Get(int id) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write("Hello, World!"); writer.Flush(); stream.Position = 0; HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Export.csv" }; return result; }
这样做可以在Chrome和Firefox中正常工作,并弹出保存对话框。注意,通过将数据写入内存流而不是响应流,可以避免一次性分配大量内存。如果需要返回大量数据,可以考虑逐个写入响应流,而不需要分配过多的内存。同时,也可以使用简单的方法`result.Content = new StringContent("Hello, World!");`来简化代码。