下载标题时不知何故插入了18行空白


Download headers somehow inserting 18 lines of whitespace

我正在尝试提供一个动态生成的csv文件。出于某种原因,当我获得该文件时,数据前面有18个空行。我定义的标题和我发送的csv数据之间没有任何空格。如果我将数据写入服务器上的文件,它不会得到这些空行。但是,如果我编写文件,然后尝试将其提供给用户,那么空行就会返回。所以我想知道是不是我把标题搞砸了,或者是不是还有另一个我没有想到的问题:

function generate_csv($source_type, $include_unpublished = FALSE) {
   // retrieve data from DB
   ....
   // start up headers
   $csv_name = "$source_type-$data_set-csv_" . date('Y-m-d') . '.csv';
   header('Content-Type: text/x-comma-separated-values');
   header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
   header('Cache-Control: private', false); // required for certain browser
   header('Content-Disposition: attachment; filename="' . $csv_name . '"'); 
   // send csv data
   print $csv_data;
} //end function

免责声明:我在https://drupal.stackexchange.com/questions/27649/extra-empty-rows-when-serving-csv-file,但它似乎不是针对drupal的,也没有太多的想法。。

也许这行"挂起"在一个输出缓冲区中,该缓冲区是在一段时间前启动的。通过这种方式,您可以在没有旧的"headers already sended"错误的情况下设置标题,但无论如何,在刷新缓冲区时,这些内容都会发送到浏览器。

尝试

ob_clean();
print $csv_data;

http://php.net/ob-clean

包含的文件一定有问题。php结束标记?>之后的每一个空白都会发送到浏览器。

最好的解决方案是在每个php文件中去掉这个结束标记。

另一种选择是只从中删除不必要的新行,或者在提供文件之前缓冲输出并忽略它。