PHP(CodeIgniter)文件下载中的空行
在我的基于CodeIgniter的站点(一个会员管理系统)上,有创建直接借记文件的功能。通过设置标题下载这些文件,如下所述:。 然而,由于某种原因,在我自己的输出之前总是输出一个空行。我尝试替换我返回的字符串中的所有换行符,但没有成功。输出是一个XML文件,由于该空行,我的银行不接受该文件作为有效的XML 我已经发现有帖子说这可能是因为当前文件之前的文件中有PHP关闭标记。这可能是原因,但是加载了多个第三方库,如果仍然希望保留更新库的选项,则手动删除每个文件中所有关闭的PHP标记是不可撤销的。似乎Smarty特别喜欢这些收尾标签 直接访问文件本身也不是一个真正的选项,因为CodeIgniter默认不允许这样做,并且因为这种方法带来了相当大的安全问题(公开访问的文件中包含银行帐户详细信息是一个很大的禁忌) 因此,我来问你:你知道这个问题的另一种可能的解决办法吗 编辑:这是用于下载的代码PHP(CodeIgniter)文件下载中的空行,php,codeigniter,download,Php,Codeigniter,Download,在我的基于CodeIgniter的站点(一个会员管理系统)上,有创建直接借记文件的功能。通过设置标题下载这些文件,如下所述:。 然而,由于某种原因,在我自己的输出之前总是输出一个空行。我尝试替换我返回的字符串中的所有换行符,但没有成功。输出是一个XML文件,由于该空行,我的银行不接受该文件作为有效的XML 我已经发现有帖子说这可能是因为当前文件之前的文件中有PHP关闭标记。这可能是原因,但是加载了多个第三方库,如果仍然希望保留更新库的选项,则手动删除每个文件中所有关闭的PHP标记是不可撤销的。似
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,那一定是问题所在
下面的回答描述了如何轻松地删除文件末尾的换行符:
给定的命令可以与linuxfind
一起使用,以删除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”)但是,这需要修改核心Codeigniter文件,并且我担心它可能会干扰输出,例如打印错误消息或调用ajax,而执行实际上并没有在您通常期望的位置(在中心index.php的末尾)完成。只有在调用该函数时才会清除输出,因此任何其他CI功能都将保持不变。至于错误,出于安全原因,您不希望打印它们-最好将它们转发(存储)到错误日志文件或数据库中。如果我错了,请纠正我,但输出不只是在执行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);