Postgresql

從 bytea 列導出圖像文件

  • February 6, 2019

我正在嘗試從 PostgreSQL 數據庫中導出圖像文件。該users_data_circulation表有一個photo(bytea) 列。

我的命令:

copy (select encode(photo,'hex') from users_data_circulation limit 1)
   TO '/tmp/imagetest.hext';

在作業系統中:

$> xxd -p -r /tmp/imagetest.hex > /tmp/imagetest.jpg
$> file /tmp/imagetest.jpg
/tmp/imagetest.jpg: ASCII TEXT

我無法打開jpg文件。如何將此文件轉換為jpg?

devinim@devinimpostgresql:~$ hexdump -C /tmp/image.hex | more
00000000  5c 5c 33 37 37 5c 5c 33  33 30 5c 5c 33 37 37 5c  |\\377\\330\\377\|
00000010  5c 33 34 30 5c 5c 30 30  30 10 4a 46 49 46 5c 5c  |\340\\000.JFIF\\|
00000020  30 30 30 01 02 5c 5c 30  30 30 5c 5c 30 30 30 01  |000..\\000\\000.|
00000030  5c 5c 30 30 30 01 5c 5c  30 30 30 5c 5c 30 30 30  |\\000.\\000\\000|
00000040  5c 5c 33 37 37 5c 5c 33  34 31 5c 5c 30 30 30 5c  |\\377\\341\\000\|
00000050  76 50 49 43 5c 5c 30 30  30 02 5c 6e 5c 6e 01 5c  |vPIC\\000.\n\n.\|
00000060  5c 30 30 30 5c 5c 33 37  37 5c 5c 33 37 36 5c 5c  |\000\\377\\376\\|
00000070  30 30 30 21 50 69 63 74  75 72 65 20 45 6c 65 6d  |000!Picture Elem|
00000080  65 6e 74 73 2c 20 49 6e  63 2e 20 49 53 45 2f 53  |ents, Inc. ISE/S|
... continues like that

在數據庫中儲存 jpeg 是一個可怕的想法。

也就是說,如果你想從數據庫中取出它,你可以使用 psql。這將其作為十六進制輸出。

psql -t -A -o "/tmp/imagetest.jpg" -c \
 "SELECT photo FROM users_data_circulation LIMIT 1";

您可能還想查看大對象。

   DO $$ 
DECLARE   
  l_lob_id OID;
  r record; BEGIN

 for r in
   select data, filename from bytea_table

  LOOP
   l_lob_id:=lo_from_bytea(0,r.data);
   PERFORM lo_export(l_lob_id,'/home/...'||r.filename);
   PERFORM lo_unlink(l_lob_id);   
   END LOOP;

END; $$

引用自:https://dba.stackexchange.com/questions/151207