我正在尝试打印此简单的代码行以了解问题所在,但它打印出整个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")
我不知道为什么它会继续这样做或如何防止它。
答案 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)
相同的代码对我来说很好用。
您只需要确保在标头之前没有任何输出,即使在这种情况下,空格也很重要。
在标头设置之前编写代码不会造成任何问题,但输出到浏览器会造成问题。因此,只需再次进行交叉检查即可。