2015-10-13 126 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); 

謝謝,那些迴應。

相關問題