Zend Framework - 使用Controller返回图像/文件

时间:2013-02-11 10:56:45

标签: zend-framework2

我是Zend Framework 2的新手,只知道一些基础知识。我发现很难找到很多例子。

问题:在数据库中获取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
    }
}

如果有人可以提供帮助,我将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:12)

从Zend Framework 2.0到2.1

如果您想要返回图片,只需返回内容中填写的响应对象:这将告诉Zend\Mvc\Application完全跳过Zend\Mvc\MvcEvent::EVENT_RENDER事件并转到Zend\Mvc\Application::EVENT_FINISH < / p>

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,而{{1}}又可以将响应发送到输出。

答案 1 :(得分: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;