1

我们在使用 yii2 从 postgres 数据库中检索上传的图像时遇到问题

我们以这种方式将图像存储到数据库:

$data = pg_escape_bytea(file_get_contents($model->CheckIfAvatarExists(Yii::$app->user->identity->username)));

$profile->passphoto = new Expression("'{$data}'");
$profile->save();

完美存储图像

但是当我们尝试显示图像时,它不起作用:

header('Content-type: image/png');

echo pg_unescape_bytea(  $profile->passphoto);

我认为最大的问题是逃逸后的数据不会回到原来的逃逸

有什么解决办法吗?

4

1 回答 1

1

考虑一下pg_unescape_bytea在线文档中用户提供的评论:

PostgreSQL 9.0 引入了“hex”作为编码二进制数据的新默认格式。因为 "pg_unescape_bytea" 只适用于旧的 "escape" 格式,所以你需要做 pg_query('SET bytea_output = "escape";'); 在执行您的选择查询之前。

事实上,只有当客户端库早于 9.0(我相信是 libq.so.5.2,现在已停产)时,它才是正确的。

如果这是您的情况,那就解释了错误转义的问题。

要强制bytea_output正确escape解码,您可以:

  • SET bytea_output=escape;在会话中作为 SQL 命令动态使用
  • 或静态地为整个数据库:ALTER DATABASE SET bytea_output=escape;
  • 或在postgresql.conf整个实例中。

理想的解决方案是将libpq客户端库升级到较新的版本,在这种情况下,这一切都不是必需的,它可以正常工作。

于 2015-08-29T14:31:24.433 回答