【问题标题】:Outputting and saving a csv in PHP在 PHP 中输​​出和保存 csv
【发布时间】:2017-05-06 17:33:45
【问题描述】:

我目前正在创建和输出 CSV,如下所示:

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file.csv');
header("Cache-Control: no-store, no-cache");

$df = fopen('php://output', 'w');
fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($csvLines as $csvLine) {
    fputcsv($df, $csvLine);
}
exit;

但是,我不仅要输出,还要将此文件保存到磁盘。如何将$df 写入文件?

注意欢迎提出改进我生成 CSV 的建议 :)

【问题讨论】:

  • $df = fopen('/path/to/where/you/want/the/file/on/disk.csv', 'w'); 而不是打开php://output;然后在 exit 之前使用 readfile('/path/to/where/you/want/the/file/on/disk.csv') 也将其发送到浏览器
  • 不要编写 UTF-8 BOM。它是not needed,很多时候它弊大于利。
  • @axiac 不幸的是,当尝试使 Excel 与 CSV 一起工作时,这种智慧并不成立(这是一种非常常见的情况)。 (尽管不幸的是,用 CSV 正确支持 Excel 更加复杂……)
  • @MarkBaker 你能把你的评论放在答案中吗?它对我的帮助最大。

标签: php csv file-handling


【解决方案1】:

最简单的答案是写入文件而不是php://output,然后使用readfile()将该文件直接发送到浏览器

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file.csv');
header("Cache-Control: no-store, no-cache");

$df = fopen('/path/to/where/you/want/the/file/on/disk.csv', 'w');
fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($csvLines as $csvLine) {
    fputcsv($df, $csvLine);
}
readfile('/path/to/where/you/want/the/file/on/disk.csv');
exit;

【讨论】:

    【解决方案2】:

    只需写入两个文件指针:

    $out = fopen('php://output', 'w');
    $file = fopen('somefile.csv');
    
    fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
    fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
    
    foreach ($csvLines as $csvLine) {
        fputcsv($out, $csvLine);
        fputcsv($file, $csvLine);
    }
    
    exit;
    

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2015-08-07
      • 2019-07-02
      • 2022-11-28
      相关资源
      最近更新 更多