【问题标题】:Download headers somehow inserting 18 lines of whitespace下载标题以某种方式插入 18 行空格
【发布时间】:2012-04-06 19:35:44
【问题描述】:

我正在尝试提供一个动态生成的 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 的,也没有很多想法出现在那里..

【问题讨论】:

  • 你使用输出缓冲吗?在这种情况下,空行也可能在您设置标题的位置之前
  • 好点。不幸的是,我没有做任何观察。
  • 您已经提到,您正在使用 Drupal。所以您确定,没有输出缓冲处于活动状态?

标签: php csv header download


【解决方案1】:

也许这行“挂起”在输出缓冲区中,该缓冲区是在一段时间之前开始的。这样您就可以设置标题,而不会出现旧的“已发送标题”错误,但是无论如何刷新缓冲区时,此内容都会发送到浏览器。

试试

ob_clean();
print $csv_data;

http://php.net/ob-clean

【讨论】:

  • 感谢@kingCrunch,您节省了很多时间。
【解决方案2】:

您包含的文件一定有问题。 php 结束标记 ?> 之后的每个空格多于一个换行符都会发送到浏览器。

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

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

【讨论】:

  • +1 真。此外,它会在<?php 之前输出内容(例如不可见的 BOM)。
  • 我查看的文件不包含 ?> 标记。有没有一种简单的方法来列出在 php 周期中包含的文件?这是 Drupal CMS 中的一个模块,所以我什至不确定在此过程中使用了哪些文件..
  • @KingCrunch - 谢谢你这样做。有人根据在线教程构建了一个示例模块,其中包含一堆 ?> 标记。尽管它与我的代码无关,但该模块已启用并且 Drupal 正在加载它,并且在我的内容之前添加了空格。包含 140 个文件,但名为 MyModule 的文件有点味道。谢谢。
猜你喜欢
  • 2012-06-06
  • 2017-12-28
  • 2022-11-16
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2013-06-09
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多