【发布时间】:2012-05-23 07:34:15
【问题描述】:
我正在寻找一种简单的方法来获取数组,将其转换为 CSV,并让用户能够下载 CSV,而无需将 CSV 保存到服务器。
【问题讨论】:
-
有什么特殊原因无法保存到服务器吗?
-
this 怎么样 - 虽然不是 php
我正在寻找一种简单的方法来获取数组,将其转换为 CSV,并让用户能够下载 CSV,而无需将 CSV 保存到服务器。
【问题讨论】:
$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');
foreach ($array as $row) {
fputcsv($fp, $row);
}
见fputcsv()
使用fputcsv 的好处是它将为您处理字段的转义和封闭,确保有效、可靠的输出即使您的列值碰巧包含 csv 控制字符(如如逗号、引号、换行符等...如果您不注意稳健地处理控制字符,而是采用通用快捷方式,例如使用implode(',', $row),您的(低质量)代码将产生损坏的 csv 输出。
不幸的是,fputcsv 不能输出到字符串,只能输出到流,所以我写到 php 的输出流,相当于echo'ing it out。如果您需要在输出之前将 csv 文件内容作为字符串访问,您也可以写入php://memory、php://temp 或文件。
$fp = fopen('php://temp', 'w+'); // or fopen('myfile.csv', 'w+');
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.
$str = stream_get_contents($fp);
【讨论】:
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...
【讨论】: