下载标题以某种方式插入18行空格

时间:2012-04-06 19:35:44

标签: php csv header download

我正在尝试提供动态生成的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的,并且那里没有太多的想法......

2 个答案:

答案 0 :(得分:6)

也许这条线在输出缓冲区中“挂起”,这是在一段时间之前启动的。通过这种方式,您可以设置标头,而不会使用旧的“已发送标头”-error,但无论如何都会在刷新缓冲区时将此内容发送到浏览器。

尝试

ob_clean();
print $csv_data;

http://php.net/ob-clean

答案 1 :(得分:2)

您所包含的文件一定有问题。

关键标记?>后,每个空格多个换行符都会被发送到浏览器。

最佳解决方案是在每个php文件中删除这个结束标记。

其他选项是从服务中删除不必要的新行或者删除输出,并在提供文件之前忽略它。