在symfony中显示存储在BLOB数据库中的图像



我在 GETer 实体中加载我的图像(blob 数据)当我刚刚在我的 GETer 中返回 ($this->foto) 时,我在屏幕上看到:资源 ID #284当我像这样更改我的 GETer 时:返回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,
    ));
}

现在在我的观点(索引.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 %}

但我没有看到图片?

谁能帮我?

您使用的是<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 %}
在您的

实体中像这样编写图像获取器:

public function getFoto()
{
    return imagecreatefromstring($this->foto);
}

并使用它代替对象"foto"属性。

函数的 PHP 文档:http://php.net/manual/de/function.imagecreatefromstring.php

一种更直接的方法,无需在控制器中进行额外的工作:

在实体类中

/**
 * @ORMColumn(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 方法,但为了获得更好的性能和可用性,正确的选择是创建自定义树枝过滤器(树枝扩展),如此处所述。

<?php

namespace YourNamespace;

use TwigExtensionAbstractExtension;
use TwigTwigFilter;
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 }}">

最新更新