2013-02-21 150 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到新的版本。