在 codeigniter 中使用控制器中的 readfile() 显示图像
Posted
技术标签:
【中文标题】在 codeigniter 中使用控制器中的 readfile() 显示图像【英文标题】:Display an image using readfile() from controller in codeigniter 【发布时间】:2016-01-11 05:21:53 【问题描述】:为了测试readfile()
,我将以下代码放在主index.php文件的最顶部,图像正确显示。但是,当我将完全相同的代码放入控制器时,它只会显示损坏的图像。
我尝试用"$this->output->set_header('Content-Type: image/jpeg');"
替换标题行,但只是得到了乱码。我怎样才能让它像从索引文件中一样从控制器显示?我难住了。
代码:
$file = '/home/www/noname.com/public/captcha/1444721011.7843.jpg';
header('Content-Type: image/jpeg');
readfile($file);
exit;
我试着把“header_remove();”在代码之前的控制器中。结果仍然只是一个损坏的图像(尽管标题看起来相同)。像这样:
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 2166
Content-Type: image/jpeg
Date: Tue, 13 Oct 2015 12:27:43 GMT
Keep-Alive: timeout=5, max=100
Server: Apache
有什么想法吗?
编辑:我确实注意到在我的所有页面上 之前都有一个空行。请参阅此链接顶部的示例,该链接也是一个 codeigniter 站点。查看来源:call2you.co。我想知道这是否可能是原因。知道那条线是从哪里来的,所以我可以删除它吗?
【问题讨论】:
【参考方案1】:我认为如果您删除 exit
调用,您的示例应该可以在控制器中正常工作。
如果你真的想中止脚本执行,那么你的方法应该是这样的:
public function display_image ()
$file = '/home/www/noname.com/public/captcha/1444721011.7843.jpg';
$contents = file_get_contents($file);
$this->output
->set_status_header(200)
->set_content_type('image/jpeg')
->set_output($contents)
->_display();
exit;
这应该允许一个干净的退出。
【讨论】:
谢谢。不幸的是,移除出口并没有改变任何东西。你的代码也没有。我确实注意到,在我的所有页面上 之前都有一个空行。请参阅此链接顶部的我的意思示例,该链接也是一个 codeigniter 站点。查看源代码:call2you.co。我想知道这是否可能是原因。知道这是从哪里来的吗? 看起来您在代码中的某处输出了一个空行,或者您在打开的 php 标签 ' 谢谢艾哈迈德。这就是问题所在。正如我在下面提到的,我用 ob_end_clean(); 解决了它。就“标头已发送”错误而言,发送 content-type:image/jpeg 是否也阻止它出现在服务器上的错误日志中?因为那并没有向我展示任何东西。 如果您将 display_errors 设置为 on,那么您的错误会发送到浏览器。【参考方案2】:我在这里回答我自己的问题。问题是在源代码顶部神秘地添加了空行。寻找那条线的来源变得太耗时了,所以我的解决方案是把 ob_end_clean();在标题之前。所以:
$file = '/home/www/noname.com/public/captcha/1444721011.7843.jpg';
ob_end_clean();
$this->output->set_header('Content-Type: image/jpeg');
readfile($file);
谢谢回复的人。
【讨论】:
以上是关于在 codeigniter 中使用控制器中的 readfile() 显示图像的主要内容,如果未能解决你的问题,请参考以下文章
显示从控制器传递的表(视图)中的数据 - Codeigniter
如何使用 CodeIgniter 3 中的外键从表中获取列数据