Come salvare in un file un’immagine contenuta in una colonna di Postgres

Poniamo di avere una tabella ‘persone’ con una colonna ‘foto’ per memorizzare la foto di una persona, qualcosa del tipo:

CREATE TABLE persone
(
 persona bigint NOT NULL DEFAULT nextval('pk_seq'::regclass),
foto bytea,
CONSTRAINT persone_pk PRIMARY KEY (persona)
);

E volessimo portare su un file la foto di una persona come possiamo fare senza ricorrere alla programmazione ?
Innanzitutto portiamo la foto in ogggetto su file in formato ‘hex’ con Il comando:

\copy (SELECT encode(foto,'hex')FROM persone WHERE persona = 1 ) TO'/home/utente/image.hex'

che deve essere eseguito all’interno della shell di psql o con gli appositi switch da linea di comando, poi lo riportiamo in binario con il comando:

$ xxd -p -r image.hex > image.jpg

Il suffissp ‘.jpg’ ovviamente è stato scelto perché riflette il contenuto binario della colonna sul database se il contenuto era in un altro formato avremmo dovuto scegliere un altro suffisso.
Il tutto funziona anche sotto windows avendo cura di cambiare il comando copy con una sintassi compatibile con il file system ntfs e cioè qualcosa del tipo:

\copy (SELECT encode(foto,'hex')FROM persone WHERE persona = 1 ) TO'c:\work\image.hex'

quindi dopo aver fatto una capatina su http://www.vim.org per  recuperare l’utility xxd potremo dare lo stesso comando visto prima e cioè:

c:\work xxd -p -r image.hex > image.jpg

Alla prossima

Andrea

Lascia un commento