我正在寻找一种简单的方法来获取数组,将其转换为 CSV 并让用户能够下载 CSV,而无需将 CSV 保存到服务器。
问问题
4448 次
2 回答
11
$array = [
['name', 'email'],
['Doe, John', 'johndoe@foo'],
['Jane Doe', 'janedoe@foo'],
['Ron "SuperFly" O\'Neal', 'supafly@foo'],
];
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=test.csv");
$fp = fopen('php://output', 'w'); // or use php://stdout
foreach ($array as $row) {
fputcsv($fp, $row);
}
见fputcsv ()
使用的好处fputcsv
是它将为您处理字段的转义和封闭,确保即使您的列值恰好包含 csv 控制字符(如逗号、引号、换行符等)也不会中断的有效、坚固的输出......如果你不要注意稳健地处理控制字符,而是采用常见的捷径,例如使用implode(',', $row)
您的(低质量)代码会产生损坏的 csv 输出。
不幸的是,fputcsv 不能输出到字符串,只能输出到流,所以我通过它写入 php 的输出流,php://output
这相当于将echo
其输出。请注意,就像通过 echo 输出一样,它将通过 php 的输出缓冲区机制,其中包括任何可能的输出处理程序,例如ob_gzhandler
可能修改输出的客户输出缓冲区回调函数。如果您希望绕过输出缓冲区,您可以直接写入php://stdout
.
如果您需要在输出之前将 csv 文件内容作为字符串访问,您也可以写入php://memory
、或文件。php://temp
$fp = fopen('php://memory', 'w+'); // or php://temp
foreach ($array as $row) {
fputcsv($fp, $row);
}
// Read it back into a string, if desired.
// Rewind the stream to start.
fseek($fp, 0);
// Read the entire stream back to string.
$csvContents = stream_get_contents($fp);
于 2012-05-15T18:52:13.823 回答
4
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=test.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "name,city,street\n";
有时最好使用
header("Content-Type: application/octet-stream");
对于 IE...
于 2012-05-15T18:34:26.063 回答