在 symfony 中显示存储在 BLOB 数据库中的图像
Display image stored in BLOB database in symfony
我在我的 GETer 实体中加载我的图像(blob 数据)
当我在我的 GETer 中 return ($this->foto) 时,我在屏幕上看到 :Resource id #284
当我像这样更改我的 GETer 时: return stream_get_contents($this->foto);
我看到了这些:����JFIF���� ( , ( 以及更多 )
在我的控制器中调用 index.html.twig 来显示我所有的实体
/**
* Lists all Producten entities.
*
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('CustomCMSBundle:Producten')->findAll();
return $this->render('CustomCMSBundle:Producten:index.html.twig', array(
'entities' => $entities,
));
}
现在在我看来(index.html.twig)我喜欢展示图片
{% for entity in entities %}
<tr>
<td>
<img src="{{ entity.foto}}" alt="" width="80" height="80" />
</td>
<td>
{{ entity.foto }}
</td>
<td>
<ul>
<li>
<a href="{{ path('cms_producten_show', { 'id': entity.id }) }}">show</a>
</li>
<li>
<a href="{{ path('cms_producten_edit', { 'id': entity.id }) }}">edit</a>
</li>
</ul>
</td>
</tr>
{% endfor %}
但是我没看到图片?
谁能帮帮我?
在您的实体中写下您的图片 getter,如下所示:
public function getFoto()
{
return imagecreatefromstring($this->foto);
}
并使用它代替对象 "foto" 属性.
php 函数文档:http://php.net/manual/de/function.imagecreatefromstring.php
您正在使用 <img src="(raw image)">
而不是 <img src="(image's url)">
一个快速的解决方案是用 base64 编码你的图像并嵌入它。
控制器
$images = array();
foreach ($entities as $key => $entity) {
$images[$key] = base64_encode(stream_get_contents($entity->getFoto()));
}
// ...
return $this->render('CustomCMSBundle:Producten:index.html.twig', array(
'entities' => $entities,
'images' => $images,
));
查看
{% for key, entity in entities %}
{# ... #}
<img alt="Embedded Image" src="data:image/png;base64,{{ images[key] }}" />
{# ... #}
{% endfor %}
一种更直接的方式,无需在控制器中进行额外工作:
实体中Class
/**
* @ORM\Column(name="photo", type="blob", nullable=true)
*/
private $photo;
private $rawPhoto;
public function displayPhoto()
{
if(null === $this->rawPhoto) {
$this->rawPhoto = "data:image/png;base64," . base64_encode(stream_get_contents($this->getPhoto()));
}
return $this->rawPhoto;
}
在视图中
<img src="{{ entity.displayPhoto }}">
编辑
感谢@b.enoit.be 对我的问题的回答 ,我可以改进这段代码,使图像可以多次显示。
如前所述,您必须使用 base64 方法,但为了获得更好的性能和可用性,正确的选择是创建自定义 twig 过滤器(Twig 扩展名),如 here 所述。
<?php
namespace Your\Namespace;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
class TwigExtensions extends AbstractExtension
{
public function getFilters()
{
return [
new TwigFilter('base64', [$this, 'twig_base64_filter']),
];
}
function twig_base64_filter($source)
{ if($source!=null) {
return base64_encode(stream_get_contents($source));
}
return '';
}
}
在您的模板中:
<img src="data:image/png;base64,{{ entity.photo | base64 }}">
我在我的 GETer 实体中加载我的图像(blob 数据) 当我在我的 GETer 中 return ($this->foto) 时,我在屏幕上看到 :Resource id #284 当我像这样更改我的 GETer 时: return stream_get_contents($this->foto); 我看到了这些:����JFIF���� ( , ( 以及更多 )
在我的控制器中调用 index.html.twig 来显示我所有的实体
/**
* Lists all Producten entities.
*
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('CustomCMSBundle:Producten')->findAll();
return $this->render('CustomCMSBundle:Producten:index.html.twig', array(
'entities' => $entities,
));
}
现在在我看来(index.html.twig)我喜欢展示图片
{% for entity in entities %}
<tr>
<td>
<img src="{{ entity.foto}}" alt="" width="80" height="80" />
</td>
<td>
{{ entity.foto }}
</td>
<td>
<ul>
<li>
<a href="{{ path('cms_producten_show', { 'id': entity.id }) }}">show</a>
</li>
<li>
<a href="{{ path('cms_producten_edit', { 'id': entity.id }) }}">edit</a>
</li>
</ul>
</td>
</tr>
{% endfor %}
但是我没看到图片?
谁能帮帮我?
在您的实体中写下您的图片 getter,如下所示:
public function getFoto()
{
return imagecreatefromstring($this->foto);
}
并使用它代替对象 "foto" 属性.
php 函数文档:http://php.net/manual/de/function.imagecreatefromstring.php
您正在使用 <img src="(raw image)">
而不是 <img src="(image's url)">
一个快速的解决方案是用 base64 编码你的图像并嵌入它。
控制器
$images = array();
foreach ($entities as $key => $entity) {
$images[$key] = base64_encode(stream_get_contents($entity->getFoto()));
}
// ...
return $this->render('CustomCMSBundle:Producten:index.html.twig', array(
'entities' => $entities,
'images' => $images,
));
查看
{% for key, entity in entities %}
{# ... #}
<img alt="Embedded Image" src="data:image/png;base64,{{ images[key] }}" />
{# ... #}
{% endfor %}
一种更直接的方式,无需在控制器中进行额外工作:
实体中Class
/**
* @ORM\Column(name="photo", type="blob", nullable=true)
*/
private $photo;
private $rawPhoto;
public function displayPhoto()
{
if(null === $this->rawPhoto) {
$this->rawPhoto = "data:image/png;base64," . base64_encode(stream_get_contents($this->getPhoto()));
}
return $this->rawPhoto;
}
在视图中
<img src="{{ entity.displayPhoto }}">
编辑
感谢@b.enoit.be 对我的问题的回答
如前所述,您必须使用 base64 方法,但为了获得更好的性能和可用性,正确的选择是创建自定义 twig 过滤器(Twig 扩展名),如 here 所述。
<?php
namespace Your\Namespace;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
class TwigExtensions extends AbstractExtension
{
public function getFilters()
{
return [
new TwigFilter('base64', [$this, 'twig_base64_filter']),
];
}
function twig_base64_filter($source)
{ if($source!=null) {
return base64_encode(stream_get_contents($source));
}
return '';
}
}
在您的模板中:
<img src="data:image/png;base64,{{ entity.photo | base64 }}">