5

我正在寻找一种简单的方法来获取数组,将其转换为 CSV 并让用户能够下载 CSV,而无需将 CSV 保存到服务器。

4

2 回答 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);

流包装信息http://www.php.net/manual/en/wrappers.php.php

于 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 回答