Web API返回csv文件

30 浏览
0 Comments

Web API返回csv文件

我需要从Web API控制器获取一个csv文件。我无法弹出“另存为”对话框。页面上只显示文本输出。我尝试过使用jquery调用导出,也试过使用普通的html。控制器代码如下:

[System.Web.Http.HttpGet]
public HttpResponseMessage Export()
{
    StringBuilder sb = new StringBuilder();
    IEnumerable list = 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) {
      });
});

仍然没有显示"另存为"对话框。

0
0 Comments

问题:

通过AJAX调用API时,无法弹出下载对话框。

原因:

通过AJAX调用API时,无法直接弹出下载对话框。AJAX是一种异步请求方式,无法直接处理文件下载的响应。

解决方法:

1. 如果API使用GET方法,可以将API调用改为普通的链接形式,例如使用``标签:

click here

2. 如果需要使用POST方法,并且希望弹出下载对话框,可以使用普通的表单提交,并设置`target="_blank"`属性,将响应结果在新窗口中打开:

Export

通过以上方法,即可解决通过AJAX调用API时无法弹出下载对话框的问题。

0
0 Comments

问题原因:通过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!");`来简化代码。

0