exporter des images stockées dans un champ bytea

Besoin

Une table contient des images, qui sont stockées dans un champ bytea :

create table photo (photo_id int, filename varchar, data bytea);

L'objectif est d'exporter toutes les photos en une seule opération, en leur restituant leur nom d'origine.

Méthode employée

Pour réaliser cette opération directement en sql (il est possible de le faire également en programmant avec un script php ou autre), nous avons besoin de disposer des droits de super-administrateur.

Les photos vont être déposées dans un dossier du serveur : il faudra ensuite les récupérer manuellement, par exemple avec une copie ssh.

Installez d'abord l'extension adminpack qui comprend des commandes permettant de manipuler facilement les objets larges :

create extension adminpack;

Nous allons créer une table (temporaire), dans un schéma dédié aux travaux, pour transformer les photos en objets larges (large objects) :

create table travaux.image (name text,raster oid);
insert into travaux.image (name, raster)
select filename, lo_from_bytea(photo_id, data)
where data is not null;

Nous allons exporter les photos dans le dossier /tmp :

select lo_export( raster, '/tmp/'||name) from travaux.image;

puis supprimer la table travaux.image, dont nous n'avons plus besoin :

drop table travaux.image;

Pour récupérer les photos, depuis un poste client :

scp serveur:/tmp/*jpg .