【问题标题】:Download Generated CSV file via Ajax通过 Ajax 下载生成的 CSV 文件
【发布时间】:2019-10-27 21:48:27
【问题描述】:

我正在尝试通过 ajax 下载或至少打开生成的 csv 文件。我设法记录了输出,一切都很好。是否可以通过 ajax 来实现,或者我必须以另一种方式尝试吗? 控制器

[HttpPost]
public FileResult GenerateEventLogsReport([FromBody]GenericReportDateViewModel Input)
{
    var report = eventLogsData.Report(Input.StartDate, Input.EndDate);
    var sb = new StringBuilder();
    foreach(var item in report)
    {
        sb.AppendLine(item.Id + "," + item.Identity + "," + item.Level + "," + item.Logger + "," + item.Message + "," + item.TimeStamp + "," + item.Action);
    }
    return File(new UTF8Encoding().GetBytes(sb.ToString()),"text/csv","EventLogs_"+ Input.StartDate +"_to_"+ Input.EndDate +".csv");
}

AJAX

var event_form_data = {
    "StartDate": $("#eventStartDate").val(),
    "EndDate": $("#eventEndDate").val(),
};
$.ajax({
    url: "@Url.Action("GenerateEventLogsReport", @ViewContext.RouteData.Values["controller"].ToString())",
    method: "POST",
    data: JSON.stringify(event_form_data),
    contentType: "application/json",
    success: function (result) {
        console.log(result);
        window.open("data:application/csv", result, "_blank");
    },
    error: function (error) {
        console.log(error);
    }
});

【问题讨论】:

标签: javascript jquery asp.net asp.net-core


【解决方案1】:

简而言之,你需要创建一个锚点,将结果的对象URL分配给href,然后在其上调用click()。此外,您的$.ajax 调用将需要指定您期待一个blob 响应,因为jQuery 中的默认设置是将响应视为文本。归结为如下代码:

$.ajax({
    url: "@Url.Action("GenerateEventLogsReport", @ViewContext.RouteData.Values["controller"].ToString())",
    method: "POST",
    xhrFields: {
        responseType: 'blob'
    },
    data: JSON.stringify(event_form_data),
    contentType: "application/json",
    success: function (result) {
        var a = document.createElement('a');
        var url = window.URL.createObjectURL(result);
        a.href = url;
        a.download = 'report.csv';
        document.body.append(a);
        a.click();
        a.remove();
        window.URL.revokeObjectURL(url);
    },
    error: function (error) {
        console.log(error);
    }
});

我还有一个working CodePen 来演示。

【讨论】:

  • 感谢您的回答。我想知道如果我只是将它存储在一个临时目录中然后从那里检索它然后删除文件会更好吗?
  • 没有。一方面,您需要一种事后清理它的方法,这意味着添加某种后台作业。否则,您只会在这个目录中乱扔报告。此外,您还需要服务这个目录。如果愿意,您可以将报告写入临时文件,但这仅用于缓存目的。不过,您仍应保留此操作以直接返回数据。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2016-07-08
  • 2014-03-19
  • 2020-10-15
相关资源
最近更新 更多