【发布时间】:2013-04-02 16:49:08
【问题描述】:
我需要将 CSV 文件写入 PHP 输出缓冲区,然后在完成写入后将该文件下载到客户端计算机。 (我想把它写在服务器上然后下载它,它正在工作,但事实证明我在生产服务器上没有写权限)。
我有以下 PHP 脚本:
$basic_info = fopen("php://output", 'w');
$basic_header = array(HEADER_ITEMS_IN_HERE);
@fputcsv($basic_info, $basic_header);
while($user_row = $get_users_stmt->fetch(PDO::FETCH_ASSOC)) {
@fputcsv($basic_info, $user_row);
}
@fclose($basic_info);
header('Content-Description: File Transfer');
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=test.csv');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize("php://output"));
ob_clean();
flush();
readfile("php://output");
我不知道该怎么办。 CSV 文件下载但不显示任何内容。我认为这与我的 ob_clean() 和 flush() 命令的顺序有关,但我不确定订购这些东西的最佳方法是什么。
感谢任何帮助。
【问题讨论】:
-
如果您写入输出缓冲区,您会立即将其发送到客户端。在这种情况下,需要先发送任何标头。
-
ob_clean() 是没有意义的,除非你在某处做了 ob_start() 。并考虑 readfile 写入输出,但您正在从该输入读取。除非您在所有这些代码之前完成了 ob_start(),否则您的 fputcsv() 已写入输出并在任何标头代码被执行之前进入浏览器。
-
只要有理由使用“@”,我就可以在 PHP 中直接命名一种方法。它不在您的代码中,因此您可以在开始时正确编写代码,而不是在每一行上种植@?
-
@WebnetMobile unserialize()?
-
@WebnetMobile 我猜是
mail()。