我的数据库中有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数据,或者不使用模型方法,使用动作来返回附加到应用程序的所有图像?
由于
答案 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.'" />';