使用标题下载CSV在PHP中不起作用

时间:2015-12-30 00:32:48

标签: php ajax csv download

我正在尝试动态生成CSV文件,并允许用户在API被命中时下载它。这是我想象的用户互动

User hit a button -> 
jquery do $.get to api -> 
api endpoint prepares data -> 
api endpoint pass in data to another function to generate csv

到目前为止,这是我的代码

    public function test(){
        header("Content-Type: text/csv");
        header("Content-Disposition: attachment; filename=file.csv");
        // Disable caching
        header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
        header("Pragma: no-cache"); // HTTP 1.0
        header("Expires: 0"); // Proxies;

        $f = fopen("php://output", "w");
        $test_data = array(
            array(
                 'something1' => '2'
           ),
            array(
                'somethign2' => '3'
            ),
        );
        foreach($test_data as $line){
            fputcsv($f, $line, ',');
        }
        fclose($f);

    }

我发现浏览器不是下载csv,而是简单地呈现结果的内容

2
3

当我使用Chrome在网络中查看时。

我尝试将内容类型更改为强制下载,但仍然具有相同的结果

任何帮助都将不胜感激。

由于

1 个答案:

答案 0 :(得分:2)

您无法使用ajax下载内容。这是一个安全功能(javascript无法以任何方式与用户的文件系统交互)。没有插件,没有黑客,它无法完成。

您不必尝试使用javascript下载文件,而是必须将浏览器本身指向该文件。如果您需要将数据传递到后面,可以使用表单执行此操作...

$("#button").click(function(){
    $("<form id='hiddenform' action='myAPIEndpoint'><input type='hidden' name='parameter1' value='somevalue' /></form>")
        .apendTo("body");
    $("#hiddenform").submit(). remove();
});

或者如果您不需要向后端输入任何数据,您可以使用指向下载页面的常规链接。