2015-10-13 122 views
0

要测试readfile(),我将以下代码放在主index.php文件的最顶部,并且图像正确显示。但是,当我将相同的代码放在我的控制器中时,它只是显示一张破碎的图像。在codeigniter中使用来自控制器的readfile()显示图像

我试着用"$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 

有什么想法?

编辑:我注意到在我的所有页面上有一个空行<!DOCTYPE html >。看到我的意思是在这个链接的顶部,这也是一个codeigniter网站的例子。 view-source:call2you.co。我想知道这是否可能是原因。任何想法,从哪里来的线,所以我可以删除它?

回答

0

我想如果你删除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; 
} 

这应该允许一个干净的退出。

+0

谢谢。不幸的是,退出并没有改变任何东西你的代码也没有。我注意到,在我的所有页面上,在<!DOCTYPE html>之前有一个空行。看到我的意思是在这个链接的顶部,这也是一个codeigniter网站的例子。 view-source:http://call2you.co/。我想知道这是否可能是原因。任何想法是从哪里来的? –

+0

看起来像是在代码中的某处输出空行,或者在打开php标记<<?php'之前有一个新行......无论如何,如果新行是问题,那么如果尝试保存已损坏图像文件并在文本编辑器中打开它应该可以看到'Headers already sent'错误...这将不会显示在浏览器中,因为您正在发送content-type:image/jpeg。 – ahmad

+0

谢谢艾哈迈德。这是问题。正如我在下面提到的,我用ob_end_clean();解决了它。至于'Headers already sent'错误消失了,是否正在发送content-type:image/jpeg以防止它出现在服务器上的错误日志中呢?因为那没有显示任何东西。 –

0

我在这里回答我自己的问题。问题是神秘地被添加到源代码顶部的空行。找到这条线的源头变得太耗时了,所以我的解决方案就是把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); 

谢谢,那些回应。

相关问题