2011-01-10 84 views
0

我有我的数据库中的斑点数据,他们是我想要显示为基本画廊的图像。显示斑点图像 - symfony

我有我写了显示图像的方法,但我得到一个错误,说这是一个字符串,而不是返回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数据,或者不使用模型方法,使用动作来返回附加到应用程序的所有图像?

感谢

+0

为什么你的图像作为二进制大对象数据存储在数据库中,如果你有他们在本地以及下`/上传/ gallery`?你在哪里使用`$ file`,从你的例子无处? – mhitza 2011-01-10 17:09:38

+0

同意...什么?你为什么要将任何东西流入$文件? – dqhendricks 2011-01-10 17:29:28

+0

看来我使用的代码here正在使用$ file上的stream_get_contents。所以我想我不小心把它丢下了。 – terrid25 2011-01-10 17:40:21

回答

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喜欢

$请求 - >的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

0

此代码没有任何意义。

为什么你要从->getFilename()stream_get_contents()只能在resource数据类型上运行二进制(读取字符串)数据?当然会抱怨。

Outputing BLOB的浏览器一样简单:

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

尝试切换您的getFilenamePath功能这一点。

public function getFilenamePath() { 
    $file_src = '/uploads/gallery/'.$this->getId().'.jpg'; 
    if (file_exists($file_src) { 
     return $file_src; 
    } else { 
     return false; 
    } 
} 
0
$profile_picture = base64_encode(stream_get_contents($image->getContent())); 
echo '<img src="data:image/jpeg;base64,'.$profile_picture.'" />';