PHP中的空行(CodeIgniter)文件下载

时间:2014-03-28 12:47:12

标签: php codeigniter download

在我的基于CodeIgniter的站点(成员管理系统)上,有创建直接借记文件的功能。这些是通过设置标题下载的,如下所述:http://www.richnetapps.com/the-right-way-to-handle-file-downloads-in-php/。 但是,由于某种原因,在我自己的输出之前总是输出一个空行。我已经尝试替换我返回的字符串中的所有换行但没有成功。输出是一个XML文件,由于这个空行,我的银行不接受该文件作为有效的XML。

我已经发现帖子说这可能是因为PHP在当前文件之前关闭了文件中的标签。这可能是原因,但是加载了几个第三方库,如果您仍然希望保留更新库的选项,则可以撤消手动删除每个文件中所有关闭的PHP标记。似乎特别是Smarty喜欢这些结束标签。

直接访问文件本身也不是一个选项,因为默认情况下CodeIgniter不允许这样做,并且因为这种方法存在相当大的安全问题(公共可访问的文件中包含银行帐户详细信息是一个很大的禁忌) 。

因此,我来​​找你:你知道另一个解决这个问题的方法吗?

编辑:这是用于下载的代码。

function incasso_archive($creditor, $date, $time, $extension)
{
    $date = str_replace("_", "-", $date);

    $fn = $this->incasso->incasso_file($creditor, $date, $time, $extension);

    $contents = file_get_contents($fn);
    $name = "Incasso $date.$extension";

    header('Content-Type: application/octet-stream');
    header('Content-Transfer-Encoding: Binary');
    header('Content-disposition: attachment; filename="'.$name.'"');
    echo $contents;
}

5 个答案:

答案 0 :(得分:3)

如果函数中的$contents没有换行符,请尝试使用输出缓冲区函数。

在文件开头,在包含任何其他文件之前,请致电ob_start();。然后,在您的函数内部echo $contents;之前添加ob_end_clean();。这将确保没有发送其他脚本的输出。

答案 1 :(得分:0)

Vi编辑器(或vim)在编辑文件的末尾留下额外的换行符。如果您已将vi用于任何包含的文件,那一定是问题。

以下回答描述了以简单的方式删除文件末尾的换行符:

How can I delete a newline if it is the last character in a file?

给定命令可以与linux find一起使用来删除php文件中的所有尾随换行符。

for i in `find /path/to/project -name *.php`
do
    perl -i -pe 'chomp if eof' $i
done

答案 2 :(得分:0)

我完全不明白你的问题,但由于你的$ content是一个字符串,你可以简单地使用

echo trim($content)

删除新行

答案 3 :(得分:0)

这适合我。

header('Content-type: text/xml');
print_r ($content);

答案 4 :(得分:0)

对于php feed,使用它删除空格ob_end_clean();

   $data['encoding'] = 'UTF-8';       
   $data['query'] = $this->Feed_model->get_feeds();
   header("Content-Type: application/rss+xml");
   ob_end_clean();
   $this->load->view('rss',$data);