Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP(CodeIgniter)文件下载中的空行_Php_Codeigniter_Download - Fatal编程技术网

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

PHP(CodeIgniter)文件下载中的空行,php,codeigniter,download,Php,Codeigniter,Download,在我的基于CodeIgniter的站点(一个会员管理系统)上,有创建直接借记文件的功能。通过设置标题下载这些文件,如下所述:。 然而,由于某种原因,在我自己的输出之前总是输出一个空行。我尝试替换我返回的字符串中的所有换行符,但没有成功。输出是一个XML文件,由于该空行,我的银行不接受该文件作为有效的XML 我已经发现有帖子说这可能是因为当前文件之前的文件中有PHP关闭标记。这可能是原因,但是加载了多个第三方库,如果仍然希望保留更新库的选项,则手动删除每个文件中所有关闭的PHP标记是不可撤销的。似

在我的基于CodeIgniter的站点(一个会员管理系统)上,有创建直接借记文件的功能。通过设置标题下载这些文件,如下所述:。 然而,由于某种原因,在我自己的输出之前总是输出一个空行。我尝试替换我返回的字符串中的所有换行符,但没有成功。输出是一个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;
}
Vi编辑器(或vim)在编辑文件的末尾留下一个额外的换行符。如果您对任何包含的文件使用了vi,那一定是问题所在

下面的回答描述了如何轻松地删除文件末尾的换行符:

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

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

我并不完全理解您的问题,但由于您的$content是一个字符串,因此您可以简单地使用

echo trim($content)

要删除新行

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

在文件开头,在包含任何其他文件之前,调用
ob_start()。然后,在函数内部,
echo$内容之前,添加
ob_end_clean()。这将确保不会发送来自其他脚本的任何输出。

这对我很有效

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

对于php提要,使用此命令删除空间ob_end_clean()


我发现从我的手机上提交此文件导致了一些难看的格式设置,将尽快修复此问题。浏览器上的格式设置看起来正常。您是在使用还是手动执行?您可以发布您正在使用的代码吗?您说您尝试了
$contents=str\u replace(“\n”,”,“,$contents”)ob\u flush()
或类似操作后打印吗?我确实理解你关于安全性的观点,但是,这是一个内部使用的工具,使用这些错误消息的页面是不可公开访问的您将关闭我们打开的输出缓冲区,因此剩下的是默认缓冲区,当脚本结束执行时(大部分时间),或者脚本的输出填满服务器缓冲区后,服务器缓冲区会将其发送到客户机,而默认缓冲区会被“刷新”。你试过了吗?显然,它的工作原理和我想象的有点不同,而且它似乎并没有破坏我所有的网站。谢谢
   $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);