写入PHP输出缓冲区,然后从缓冲区下载CSV

Jon*_*ins 4 php csv

我需要将一个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");
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做.CSV文件下载但不显示任何内容.我认为它与我的ob_clean()和flush()命令的顺序有关,但我不确定订购这些东西的最佳方法是什么.

任何帮助表示赞赏.

Jas*_*son 9

你做得太多了.创建脚本的唯一目的是输出CSV.只需将其直接打印到屏幕上即可.不要担心标题或缓冲区或php://输出或类似的东西.

一旦确认您正确地将数据打印到屏幕上,只需在开头添加这些标题:

<?php
header("Content-disposition: attachment; filename=test.csv");
header("Content-Type: text/csv");
?>
Run Code Online (Sandbox Code Playgroud)

...确认适当下载文件.然后你可以添加其他标题如果你喜欢(我上面包含的标题是我自己使用的标题,没有任何额外的工作,其他基本上是效率和缓存控制,其中一些可能已经适当处理由您的服务器,可能或可能不重要您的特定应用程序).

如果需要,可以使用输出缓冲ob_start()ob_get_clean()将输出内容输入到字符串中,然后可以使用该字符串填写Content-Length.

  • 感谢真正帮助我,不像其他人抱怨我做错了什么 (6认同)