2013-02-11 47 views
2

我是Zend Framework 2的新手,只知道一些基本知識。我發現很難找到很多例子。Zend Framework - 使用控制器返回圖像/文件

Quesiton:獲取數據庫中的BLOB字段並通過控制器顯示它。例如:www.mysite.com/images/2將從數據庫中檢索BLOB並將其作爲圖像顯示給用戶,因此像<img src="http://www.mysite.com/images/2"/>這樣的html標籤將顯示圖像。

我通常在ASP.NET MVC中做它,但不知道如何在這裏做到這一點。如果有人能夠啓發我如何實現它,我會很高興。

假設我已從數據庫中提取圖像。

我設法找到如何返回JSON,並相信一些簡單的事情會工作。但找不到解決方案。我還需要發送這樣的文件。

public function displayAction() 
{ 
    $id = 10; 
    $albumImage = $this->getAlbumImageTable()->getAlbumImage($id); 

    if ($albumImages){ 
     //Show the image $albumImage 
     //return JsonModel(array(...)) for json but for image ??? 
    } else{ 
     //Show some other image 
    } 
} 

如果有人能幫上忙,我將不得不承擔責任。

在此先感謝。

回答

11

作爲Zend框架的2.0〜2.1

如果你想返回的圖像,只需返回與內容填充響應對象:這將告訴Zend\Mvc\Application完全跳過Zend\Mvc\MvcEvent::EVENT_RENDER事件和去Zend\Mvc\Application::EVENT_FINISH

public function displayAction() 
{ 
    // get image content 
    $response = $this->getResponse(); 

    $response->setContent($imageContent); 
    $response 
     ->getHeaders() 
     ->addHeaderLine('Content-Transfer-Encoding', 'binary') 
     ->addHeaderLine('Content-Type', 'image/png') 
     ->addHeaderLine('Content-Length', mb_strlen($imageContent)); 

    return $response; 
} 

這將導致應用程序short-circuitZend\Mvc\Event::EVENT_FINISH,這反過來又能夠發送到輸出響應的。

+0

這是很整潔,我遇到了一些問題'mb_strlen ',我刪除它:D。 – 2013-02-11 12:56:18

+0

這是一個非常耗費CPU的操作,你知道任何解決方案嗎? – 2014-09-25 18:07:29

0

除了Ocramius'的代碼,如果您要上傳的圖片到應用程序中的文件夾,你可以檢索的內容,使用:

$imageContent = file_get_contents('data/image/photos/default.png'); 
$response->setContent($imageContent); 
$response 
    ->getHeaders() 
    ->addHeaderLine('Content-Transfer-Encoding', 'binary') 
    ->addHeaderLine('Content-Type', 'image/png') 
    ->addHeaderLine('Content-Length', mb_strlen($imageContent)); 

return $response; 
相關問題