【问题标题】:Download CSV using header does not work in PHP使用标头下载 CSV 在 PHP 中不起作用
【发布时间】:2015-12-30 00:32:48
【问题描述】:

我正在尝试动态生成一个 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 在网络中查看时。

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

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 如果将file.csv 括在引号中会怎样?像这样:header("Content-Disposition: attachment; filename=\"file.csv\"");

标签: php ajax csv download


【解决方案1】:

你不能用 ajax 下载东西。这是一项安全功能(javascript 不能以任何方式与用户的文件系统交互)。没有插件,没有黑客,这是做不到的。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多