我无法让浏览器提示下载。输出显示在屏幕上。我在这个网站上尝试了很多关于这个主题的其他主题,但无济于事。我可以将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);
请帮忙!非常感谢。
答案 0 :(得分:0)
你的代码非常接近我,但我有这个
header("Content-type: application/vnd.ms-excel");
表示内容类型。我认为这是有效的,因为浏览器知道如何处理text / csv,但他们不知道如何处理excel。它会提示下载,因为它本身不会打开这种类型的文件。
我也没有“必须重新验证”,但我认为这不会有所作为。
编辑:
这是我的完整标题,它已经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调用上设置标头将被忽略。
以下是我的系统如何处理csv生成。因为我需要在不同的csv文件之间有所不同的特定信息,所以我将生成器文件的名称放入表单的“action”中并提供了一个提交按钮:
<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
。
答案 1 :(得分:-1)
我建议只使用fputcsv函数回复CSV文件的行(请注意我使用的标题与您的标题略有不同):
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename={$fileName}");
header("Content-Transfer-Encoding: binary");
while ($row = mysql_fetch_row($sql)) {
// optionally enclose data if necessary
foreach ($row as $k => $v) {
if (strpos($v, ',') !== false) {
$row[$k] = '"' . $v . '"';
}
}
echo implode(',', array_values($row));
}