2013-02-21 121 views
1

我试图在数据库中保存一个文件,并且无法检索它。 结果不是有效的文件。在Postgres-DB中存储/读取文件

隔离代码的一部分,我认为这应该工作:

$content = pg_escape_bytea (file_get_contents($tmp)); //image.jpg 
header('Content-type: ' . $mime); // image/jpg 
echo pg_unescape_bytea($content); exit; 

$content存储,但我不能再读一遍!

怎么办?

+0

PHP版本和PostgreSQL版本?你有没有机会使用一个较新的PostgreSQL,默认为'bytea_output = hex'? – 2013-02-21 04:00:12

+0

我不明白你为什么在从磁盘加载的二进制文件上使用postgresql转义函数。 – greg 2013-02-21 09:21:24

+0

@greg文件来自上传。我可以再次插入和选择$内容,但如果这部分不起作用,什么都不会起作用。或者你的意思是说,在插入前我不需要pg_escape_bytea? – Falci 2013-02-21 11:31:48

回答

1

一种可能的解释是,你在这个配置是:

  • PHP端使用8.4以上libpq
  • 服务器9.0或更新
  • bytea_output配置参数保留到其默认值(hex

在这种情况下,pg_unescape_bytea将无法​​正确解码来自数据库的文本格式的bytea内容。作为解决方法,您可以添加到php代码中:

pg_query("SET bytea_output=escape"); 

在选择bytea内容之前,看看是否有区别。如果它确实解决这个问题,你可以通过发出使其成为数据库中的永久设置:

ALTER DATABASE mydb SET bytea_output=escape; 

,直到升级libpq到新的版本。