我已经浏览了一些类似的问题,但是找不到我想要的东西(请不要将其标记为重复,因为我确实尝试在未发布问题的情况下找到答案)
当用户单击按钮时,ajax请求将发送到控制器,在控制器中,我将从模型中获取数据。然后,我将其转换为csv格式,并且在ajax调用成功后,我希望下载该文件。除了下载部分,我所有工作正常。我看过一些示例,其中您仅重定向但不下载任何内容,它显示了包含结果的新页面。
$( '.spExcel' ).on('click', function() {
$.ajax({
url: url + '/Widgets/exportSpExcel',
type: 'POST',
})
.done(function (data) {
window.location.assign(data);
})
});
PHP:
if($_SERVER['REQUEST_METHOD'] === 'POST') {
$results = $this->DashboardModel->listPeople();
$filename = 'People_' . date('dmY') . '.csv';
header("Content-Description: File Transfer");
header("Content-Type: application/csv");
header("Content-Disposition: attachment; filename=$filename");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
$handle = fopen('php://output', 'w');
$header = array("Name", "Contact Number");
fputcsv($handle, $header);
foreach ($results as $result):
fputcsv($handle, $result);
endforeach;
fclose($handle);
}
答案 0 :(得分:1)
Ajax无法编写下载的文件-浏览器必须自行完成。您可以使用window.open()
,但这将在新的标签或窗口中打开文件,然后将其立即关闭。看起来很乱-可以,但是不理想。
最简单的处理方法是使链接直接下载响应,而无需尝试使用Ajax。更改链接以适合您的需求,但这可能是这样的...
<a href="/Widgets/exportSpExcel" class="spExcel" download>click to download</a>
只需将download
属性添加到链接。真的就是这么简单:)