如何更正Content-Disposition标头中的文件名值?

时间:2015-03-11 02:33:10

标签: php csv header

这段代码几乎解决了我通过.csv将查询保存到php的问题 - 但我无法理解为什么当它提示我保存为export.csv时,该文件会打开空白,而file.csv与我需要的数据同时完美保存。我确信它的标题显而易见。有人可以帮忙吗?

***编辑下面的建议让我进入这个状态,它不再保存文件并提示空白,但现在正确的文件显示HTML垃圾。这个脚本中没有其他HTML - 我已经尝试过许多其他帖子的建议。我怎么解决?

$query = "SELECT * from Table";

$result = mysqli_query($connS, $query);

   $headers = $result->fetch_fields();
foreach($headers as $header) {
    $head[] = $header->name;
}
$fp = fopen('php://output', 'w');

header('Content-Disposition: attachment; filename="export.csv"');
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
    fputcsv($fp, array_values($head)); 
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    $fp = fopen('file.csv', 'w');
    readfile($fp);
    fclose($fp);

end();

1 个答案:

答案 0 :(得分:0)

您目前只将内容保存到文件,而不是将其发送到用户的浏览器。也许在readfile声明之前尝试添加对die的调用。

所以你的最后一行看起来像这样:

    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    readfile($fp);
    die; 
}

Readfile读取文件并将其写入输出缓冲区。您可以在readfile函数here找到更多信息。


请注意您当前正在进行此操作的方式(在用户可以下载之前保存到文件中),如果两个用户同时点击该页面,他们可能会踩到彼此。脚趾(并创建两个创建的CSV的奇数混合)。您可能只想使用接受的答案中的代码来尝试outputting the CSV contents directly to the user's browser。如果您在标题之后执行此操作,则应该导致浏览器将其视为要下载的文件。