2011-03-31 112 views
0

我有這個工作kohana 2,但在kohana 3它沒有。Kohana 3,服務圖像存儲在數據庫

要服務於數據庫中存儲爲BLOB的圖像,我做了以下內容:

1-控制器,而我要求做我想做的形象。我使用當然模型連接到數據庫,並使用視圖提供圖像。

$prod = ORM::factory('product',$idx); 
$img = new View('image'); 
$img->pic = $prod->getImage(); 

2,該模型有一個小竅門得到這個工作:

public function getImage() 
    { 
    return imagecreatefromstring($this->image); 
    } 

形象是我存放我想爲圖片中的BLOB列。

3-在視圖: 予設定的Content-Type頭,然後服務於圖像

header('content-type: image/png; charset=UTF-8'); 
imagepng($pic); 

這個工作中的Kohana 2,但在KO3沒有,

I」想要使用$響應 - >由send_file(),但我迷路

+1

顯示控制器代碼,請(用'$響應 - >由send_file()'等等) – biakaveron 2011-04-01 05:19:57

回答

0

首先,你永遠不應該用header(),除非你是黑客FW發送頭。 Ko3.1很好地區分了Request from Response和後者是負責響應標頭/其他的一切(它們都是在RFC 2616之後寫的)。

其次,有absolutelly在這種情況下沒有必要對一個視圖文件,響應:: $ _身體就是當前的響應對象的回報。

響應::由send_file()返回響應,下載,我想這是不是你想要完成什麼?

所以,你需要像這樣(修改自己的需要):

public function action_image($id) 
{ 
    $image = ORM::factory('product', $id); 

    if (! $image->loaded()) // ... 404 ? 

    $this->response 
     ->headers('Content-Type','image/png') 
     ->body($image->image) 
     ->check_cache(NULL, $this->request); // 304 ? 
} 
+0

BTW。我建議你使用本地數據庫函數來保存這些數據,並且在後面的日誌中保存etag(稍後作爲check-cache的第一個參數傳遞它) – Kemo 2011-04-01 23:01:06

+0

它變得很棒!謝謝! 我不得不從數據庫返回的數據,因爲它是imagecreatefromstring打破了圖像......真的不知道爲什麼(我的意思是,它在KO2工作)。我對此很着急,所以,再次感謝你! – fermar 2011-04-02 02:35:23