为什么来自 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
属性 中
我覆盖了 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
属性 中