为什么来自 blob 字段的图像只显示一次?

Why image from blob field displays only once?

我覆盖了 FOSUserBundle。 我将用户实体(此实体扩展 FOSUser 实体)中的头像字段 getter 和 setter 更改为:

/**
* @ORM\Column(type="blob")
*/
protected $avatar;

public function setAvatar($avatar) {
    if ($avatar != null) {
        $strm = fopen($avatar->getRealPath(), 'rb');
        $this->avatar = stream_get_contents($strm);
    }
    return $this;
}

public function getAvatar() {
    if ($this->avatar != null) {
        return base64_encode(stream_get_contents($this->avatar));
    } else {
        return $this->avatar;
    }
}

它有效,但仅在第一次渲染时有效

<img alt="User avatar" src="data:image;base64,{{app.user.avatar}}"/> //working
<img alt="User avatar" src="data:image;base64,{{app.user.avatar}}"/> //not working

如果我第一次尝试显示此字段,一切正常,并且每次下一次呈现都显示空字符串。为什么?如何解决这个问题?

其他领域工作正常。

从数据库加载实体时,Doctrine 不会使用您的设置器来填充您的实体。因此,当您第一次调用 getAvatar() 时,会执行 stream_get_contents() 并从流中读取所有内容。下次调用此 getter 方法时,将没有任何内容可从流中读取。当 getAvatar() 像在 setAvatar().

中那样调用时,您可能希望将 stream_get_contents() 返回的字符串保存在 $avatar 属性 中