我无法让浏览器提示下载。输出反而显示在屏幕上。我在这个网站上尝试了很多关于这个主题的其他话题,但都无济于事。我可以将 fopen("php://output","w")
更改为 fopen("export.csv","w")
但这将节省服务器上 export.csv
文件的副本,我不想要它。我希望文件在客户端下载而不保存在服务器上。这是我的代码:
$sql = mysql_query($_SESSION["export-query"]);
$fields = mysql_num_fields($sql);
$header = array();
for ($i = 0; $i < $fields; $i++) {
$header[] = mysql_field_name($sql, $i);
}
$f = fopen("php://output","w");
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=export.csv');
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate');
fputcsv($f, $header);
while ($row = mysql_fetch_row($sql)) {
fputcsv($f, $row);
}
fclose($f);
求助!非常感谢。
最佳答案
你的代码和我的很接近,但我有这个
header("Content-type: application/vnd.ms-excel");
为内容类型。我认为这是可行的,因为浏览器知道如何处理 text/csv 但他们不知道如何处理 excel。它会提示下载,因为它不会自己打开这种类型的文件。
我也没有“必须重新验证”,但我认为这没有什么不同。
编辑:
这是我的完整 header ,它们在 100% 的时间内都有效。与您的略有不同,所以可能其中之一是原因。
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=".$filename.".csv");
header("Pragma: no-cache");
header("Expires: 0");
编辑 2:
从您对答案的评论来看,您将所有这些代码作为 ajax 调用放在 div 中。不起作用的原因是您只能在初始调用页面时设置标题。在 ajax 调用上设置 header 将被忽略。
以下是我的系统处理 csv 生成的方式。因为我需要的特定信息可能因不同的 csv 文件而异,所以我将生成器文件的名称放入表单的“操作”中并提供了一个提交按钮:
<form action="thegeneratorpage.php" method="get"><fieldset>
<p>Download [...] in .csv (Excel) form. You can narrow by [...].</p>
<!-- code here that allows users to narrow down what is in the csv -->
<input type="submit" value="Download" />
</fieldset></form>
如果信息没有变化,你可以这样做:
<a href="thegeneratorpage.php">Download CSV</a>
我们一直在讨论的所有代码都在 thegeneratorpage.php
上。
关于PHP/MYSQL 到 CSV 导出代码打印到屏幕而不是 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395297/