导出CSV可以继续打印HTML页面

时间:2018-10-04 12:54:42

标签: php html csv

我正在尝试打印此简单的代码行以了解问题所在,但它打印出整个HTML代码,而完全忽略了小数组

$list = array(
    "Peter,Griffin,Oslo,Norway",
    "Glenn,Quagmire,Oslo,Norway",
);
$file = fopen("php://output", "w");
foreach ($list as $line) {
    fputcsv($file, explode(',', $line));
}
fclose($file);

header("Content-Type: application/text");
header("Content-Disposition: attachment; filename=SDS.csv")

我不知道为什么它会继续这样做或如何防止它。

2 个答案:

答案 0 :(得分:2)

在写入任何其他输出之前,您必须先编写标题(内容类型,Cookie等)。如果您在内容之后写标题,则会将其静默丢弃。

在某些情况下,启用输出缓冲并且尚未将缓冲区刷新到客户端后,在内容之后写入标头似乎可以正常工作。

编辑:如上面的注释所示,该代码可能无法正常工作,因为该网页似乎直接在CSV数据之前输出。在这种情况下,必须将对网页和CSV的请求分为两部分。例如,可以使用GET / POST参数(取决于语义)来区分应返回的内容,或者使用PATH_INFO(如果以这种方式配置服务器)。

<?php
if(isset($_GET['format']) && ($_GET['format'] == "csv")) {
  header("Content-Type: application/text");
  header("Content-Disposition: attachment; filename=SDS.csv");

  $list = array(
    "Peter,Griffin,Oslo,Norway",
    "Glenn,Quagmire,Oslo,Norway",
  );
  $file = fopen("php://output", "w");
  foreach ($list as $line) {
    fputcsv($file, explode(',', $line));
  }
  fclose($file);

  /*
    Now terminate processing of the script so following HTML
    is not written.
  */
  return;
}
?>
<!DOCTYPE HTML>
<html>
 <head>
  <title> CSV example </title>
 </head>
 <body>
  <p> Download <a href="example?format=csv">CSV</a> from here </p>
 </body>
</html>

答案 1 :(得分:0)

相同的代码对我来说很好用。

您只需要确保在标头之前没有任何输出,即使在这种情况下,空格也很重要。

在标头设置之前编写代码不会造成任何问题,但输出到浏览器会造成问题。因此,只需再次进行交叉检查即可。