Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 30/03/2010 17:25:38
- troycanneda
- Membre
Stocker/lire du binaire par requete sql
Bonjour,
Je souhaite stocker des petits fichiers (fichier image, fichier texte) dans ma base.
J'envisage d'utiliser un champ de type bytea, puisque mes fichiers sont relativement petits (<300ko).
Par contre, je n'arrive pas à trouver une solution/fonction pour écrire/lire directement ce type de données en sql.
A savoir, je voudrais insérer ce type de données directement via un insert...l'idéal serait d'avoir une fonction qui chargerait directement à partir d'un chemin : ex -> insert into matable values (file_to_area("c:\monfichier.txt"))
idem en lecture pour recuperer le flux binaire.
J'espère m'être fait comprendre ;-)
Je travaille en delphi avec les composants d'accès Bdd Zeos Access : j'ai une solution de repli par une solution basée sur le edit/post (voir ci-dessous), mais je préfèrerait une solution full sql
[
if Dataset.State <> dsEdit then
Dataset.Edit;
BlobStream := Dataset.CreateBlobStream(
Dataset.FieldByName(edtBlobColumn.Text), bmWrite);
try
FileStream := TFileStream.Create(dlgOpenFile.FileName, fmOpenRead);
try
BlobStream.CopyFrom(FileStream, FileStream.Size);
finally
FileStream.Free;
end;
finally
BlobStream.Free;
end;
Dataset.Post;
]
A vous lire
D'avance merci.
Hors ligne
#2 30/03/2010 17:29:46
- gleu
- Administrateur
Re : Stocker/lire du binaire par requete sql
La lecture du fichier peut se faire via une requête SQL mais cela sous-entend que le fichier est lisible par l'utilisateur postgres et donc qu'il se trouve sur le serveur PostgreSQL.
Guillaume.
Hors ligne
#3 30/03/2010 17:36:00
- troycanneda
- Membre
Re : Stocker/lire du binaire par requete sql
La lecture du fichier peut se faire via une requête SQL mais cela sous-entend que le fichier est lisible par l'utilisateur postgres et donc qu'il se trouve sur le serveur PostgreSQL.
Merci de votre réponse très rapide, mais pourriez vous être plus explicite ?
A la lecture de ce post (http://forums.postgresql.fr/viewtopic.php?id=146), il semble que cela ne soit pas possible d'écrire ce type de donnée via un insert pur : Vous confirmez qu'il n'existe aucune fonction spécifique ?
Hors ligne
#4 30/03/2010 20:01:17
- gleu
- Administrateur
Re : Stocker/lire du binaire par requete sql
Il est possible d'utiliser une fonction (que vous devrez écrire car elle n'existe pas) pour lire des données binaire d'un fichier et les placer dans un champ de type bytea. Ça donnerait une requête du type :
INSERT INTO la_table (la_colonne_bytea) VALUES (la_fonction('/chemin/vers/fichier'));
Mais comme je le disais, cette fonction n'existe pas, il faut l'écrire. De plus, cette fonction étant exécutée côté serveur, elle ne pourra accéder qu'à un fichier présent sur le serveur et il faudra que l'utilisateur postgres ait le droit d'accéder à ces fichiers.
Autrement dit, il est bien plus simple que l'applicatif lise lui-même le fichier binaire, stocke tout ça dans une variable et renvoie le tout dans une requête du type :
INSERT INTO la_table (la_colonne_bytea) VALUES ('les données binaires');
Guillaume.
Hors ligne
#5 30/03/2010 21:54:34
- troycanneda
- Membre
Re : Stocker/lire du binaire par requete sql
Autrement dit, il est bien plus simple que l'applicatif lise lui-même le fichier binaire, stocke tout ça dans une variable et renvoie le tout dans une requête du type :
INSERT INTO la_table (la_colonne_bytea) VALUES ('les données binaires');
Entièrement d'accord : on en revient à ma question initiale , quelle syntaxe sql pour ce type d'insert ? ce que vous mettez dans 'les données binaires' doit correspondre à quoi : une simple chaine de caractères correspondant au fichier ? on aurait donc un truc du style :
INSERT INTO la_table (la_colonne_bytea) VALUES ('zs&é<"@drflc;p)9'), 'zs&é<"@drflc;p)9' étant la représentation caracteres du fichier, tout simplement ? Dans ce cas là, quel intérêt de stocker dans un champ de type bytea, et pas un champ de type text ? Optimisation de l'espace ?
merci
Hors ligne
#6 30/03/2010 23:18:09
- gleu
- Administrateur
Re : Stocker/lire du binaire par requete sql
Pour stocker dans un champ text, il faut respecter l'encodage indiquée au niveau de la base. Donc stocker des données binaires dans un champ text ne fonctionnera pas si la donnée binaire ne correspond pas à un code accepté par l'encodage.
Autrement dit, utiliser un bytea permet de stocker des octets comme 0x00. Pour stocker ces informations, il faut réaliser un « échappement » des données. C'est le pilote qui fournit ça. Par exemple, en PHP, il faut utiliser la fonction pg_escape_bytea. Sur d'autres langages, elle aura un autre nom.
Guillaume.
Hors ligne
#7 30/03/2010 23:26:31
- troycanneda
- Membre
Re : Stocker/lire du binaire par requete sql
Pour stocker dans un champ text, il faut respecter l'encodage indiquée au niveau de la base. Donc stocker des données binaires dans un champ text ne fonctionnera pas si la donnée binaire ne correspond pas à un code accepté par l'encodage.
Autrement dit, utiliser un bytea permet de stocker des octets comme 0x00. Pour stocker ces informations, il faut réaliser un « échappement » des données. C'est le pilote qui fournit ça. Par exemple, en PHP, il faut utiliser la fonction pg_escape_bytea. Sur d'autres langages, elle aura un autre nom.
Ok. Merci beaucoup pour ces explications précises... Je vais me mettre en quête de la solution en Delphi. Merci aussi pour votre promptitude.
Hors ligne
#8 18/08/2010 16:46:41
- nanou86
- Membre
Re : Stocker/lire du binaire par requete sql
Bonjour,
Je suis à la recherche de l'équivalent en C de cette merveilleuse fonction qu'est pg_escape_bytea mais je ne la trouve pas... Je dois surement être fatigué car elle ne doit pas être bien difficile à trouver... mais bref si quelqu'un l'a déjà rencontré ou utilisé qu'il n'hésite pas à me faire signe
A bientôt
Hors ligne
#9 18/08/2010 17:19:47
- nanou86
- Membre
Re : Stocker/lire du binaire par requete sql
Autant pour moi j'ai réussi à me réveiller et à trouver dans les fonctions de libpq celle qui fera mon bonheur : PQescapeByteaConn
A bientôt !
Hors ligne
Pages : 1