显示blob图像 - symfony

时间:2011-01-10 17:05:05

标签: php symfony1

我的数据库中有blob数据,它们是我想要显示为基本库的图像。

我有一个方法,我已经编写了显示图像,但我收到一个错误,说它是一个字符串,而不是返回blob数据:

public function getFilenamePath()
{
    $file_src = false;
    if (null !== $fp = $this->getFilename())
    {
      $file = stream_get_contents($fp);
      $file_src = '/uploads/gallery/'.$this->getId().'.jpg';
    }
    return $file_src;
 }

其中getFilename()是我的blob列。

动作:

 public function executeSingle(sfWebRequest $request)
 {
    $application_id = $this->getRequestParameter('id');
    $c = new Criteria();
    $c->addJoin(GalleryPeer::APPLICATION_ID, ApplicationPeer::ID);
    $c->addJoin(GalleryImagePeer::GALLERY_ID, GalleryPeer::ID);
    $c->add(GalleryPeer::APPLICATION_ID, $application_id);

    $this->galleries = GalleryImagePeer::doSelect ( $c ); 
 }

模板:

           foreach($galleries as $gallery)
           {

            $path = $gallery->getFilenamePath();
            if($path)
            {
               echo '<img src="'.$path.'" />';
            }

           }

我得到的错误是stream_get_contents似乎正在返回一个字符串。

无论如何,我可以获取blob数据,或者不使用模型方法,使用动作来返回附加到应用程序的所有图像?

由于

4 个答案:

答案 0 :(得分:4)

如果您将图像存储在数据库中,您(基本上)有两个选项可以在客户端上显示它们:

第一个解决方案:获取文件内容并使用base64编码对其进行编码。你可以在这里找到一个有效的例子:

  

http://www.php.net/manual/en/function.base64-encode.php#99842

这种方法不是最好的,就像你这样做,客户端将无法缓存这些图像,这意味着更多的流量,更多的处理时间,更多的数据库连接,更慢的页面加载等。

第二个解决方案:您在Symfony中创建了一个图像加载操作。路由如下:

mapimage:
  url: /myimage/:image_id.png
  param: { module: myimagemodul, action: myimageaction }

你必须创建一个控制器动作myimageaction,你可以在那里获得像

这样的图像ID

$请求 - &GT;的getParameter( 'image_id');

从数据库中获取blob数据并将其作为具有特定http标头的二进制文件返回。您可以通过简单的Googleing找到工作示例,例如:

$this->image = ImagePeer::retrieveByPk ($request->getParameter('image_id'));

$response = $this->getResponse();
$response->clearHttpHeaders();
$response->setContentType ($this->image->getMimeType());
$response->setHttpHeader ('Content-Disposition', 'inline;filename='.$filename);
$content = $this->image->getData();
$response->setContent (stream_get_contents ($content));

$this->setLayout (false);
return sfView::NONE;

所以在模板中你可以这样做:

<img src='<?= url_for ('route_to_action_above', array ('image_id' => $image->getId()) ?>'/>

我在

找到了这个
  

http://forum.symfony-project.org/viewtopic.php?f=22&t=31207#p109705

答案 1 :(得分:0)

这段代码没有任何意义。

为什么要将->getFilename()的二进制(读取字符串)数据提供给仅在stream_get_contents()数据类型上运行的resource?当然会抱怨。

将blob输出到浏览器非常简单:

$this->getResponse->setContentType('image/jpeg');
echo $data->getFilename(); // assuming filename column is your blob column

答案 2 :(得分:0)

尝试将getFilenamePath函数切换为此。

public function getFilenamePath() {
    $file_src = '/uploads/gallery/'.$this->getId().'.jpg';
    if (file_exists($file_src ) {
        return $file_src;
    } else {
        return false;
    }
}

答案 3 :(得分:0)

$profile_picture = base64_encode(stream_get_contents($image->getContent()));
echo '<img src="data:image/jpeg;base64,'.$profile_picture.'" />';