将数据库查询结果转换为excel,并允许从ajax调用下载

时间:2018-08-03 12:48:24

标签: php jquery ajax

我已经浏览了一些类似的问题,但是找不到我想要的东西(请不要将其标记为重复,因为我确实尝试在未发布问题的情况下找到答案)

当用户单击按钮时,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);

    }

1 个答案:

答案 0 :(得分:1)

Ajax无法编写下载的文件-浏览器必须自行完成。您可以使用window.open(),但这将在新的标签或窗口中打开文件,然后将其立即关闭。看起来很乱-可以,但是不理想。

最简单的处理方法是使链接直接下载响应,而无需尝试使用Ajax。更改链接以适合您的需求,但这可能是这样的...

<a href="/Widgets/exportSpExcel" class="spExcel" download>click to download</a>

只需将download属性添加到链接。真的就是这么简单:)