Javascript 通过Ajax下载生成的CSV文件
我正在尝试通过ajax下载或至少打开生成的csv文件。我已经设法记录了输出,一切都很好。是否可以通过ajax实现,或者我必须尝试另一种方式? 控制器Javascript 通过Ajax下载生成的CSV文件,javascript,jquery,asp.net,asp.net-core,Javascript,Jquery,Asp.net,Asp.net Core,我正在尝试通过ajax下载或至少打开生成的csv文件。我已经设法记录了输出,一切都很好。是否可以通过ajax实现,或者我必须尝试另一种方式? 控制器 [HttpPost] public FileResult GenerateEventLogsReport([FromBody]GenericReportDateViewModel Input) { var report = eventLogsData.Report(Input.StartDate, Input.EndDate); v
[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");
}
阿贾克斯
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);
}
});
简而言之,您需要创建一个锚点,将结果的对象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);
}
});
我还有一个演示。看看,谢谢你的回答。我想知道,如果我只是把它存储在一个临时目录中,然后从那里检索它,然后删除文件,是否会更好?不,首先,你需要一种事后清理的方法,这意味着添加一些后台工作。否则,您只需在该目录中乱丢报告。此外,您还需要为这个目录提供服务。如果愿意,可以将报告写入临时文件,但这仅用于缓存目的。不过,您仍然应该保留此操作以直接返回数据。