PostgreSQL Blob image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

PostgreSQL Blob image

Message par fd »

Bonjour,

Après avoir travaillé les blob avec des images (logo et fond) sous sqlite, je cherche vainement à transférer mon programme sous postgreSQL pour le mettre en réseau. Or il semble que l'image ne soit pas sauvegardée dans la base. Le fichier en retour est vide. Y a t il une limite avec les jpg et le format bytea ? J'ai essayé avec catchimage et le transfert direct dans un fichier sans succès.

Code : Tout sélectionner

Procedure EcrireLogo()
Image.s = Chemin+"Couvertures\S_Couverture.jpg"

SetGadgetText(#Text_0, "Couverture") 
SetGadgetText(#Text_1, "Lecture fichier image")     
LoadImage(#Image_1, Image)
SetGadgetState(#Image_0, ImageID(#Image_1))

TailleImage=FileSize(Image)
*buffer=AllocateMemory(TailleImage)
ReadFile(#File_0,Image)
ReadData(#File_0,*buffer,TailleImage)
CloseFile(#File_0)

SetGadgetText(#Text_1, "Ecriture PgSQL") 
SetDatabaseBlob(#Base_0,0,*buffer,TailleImage)
If DatabaseUpdate(#Base_0, "INSERT INTO image(titre,image) VALUES ('Couverture', $1 );")=0
  Debug DatabaseError()
EndIf
FreeMemory(*buffer)
FinishDatabaseQuery(#Base_0) 
EndProcedure

Procedure LireBase()
DatabaseQuery(#Base_0,"SELECT image FROM image WHERE titre = 'Couverture';") 
NextDatabaseRow(#Base_0)   
picsize = DatabaseColumnSize(#Base_0,0)
*blobreadbuffer = AllocateMemory(picsize)
GetDatabaseBlob(#Base_0, 0, *blobreadbuffer, picsize) 

;  If CatchImage(#Image_1, *blobreadbuffer,picsize) 
;    SetGadgetState(#Image_0, ImageID(#Image_1)) 
;  Else
;    MessageRequester("Erreur","",0)   
;  EndIf 

;EndIf
;MessageRequester("0k","",0)  
;FinishDatabaseQuery(#Base_0)  

Image2.s=Chemin+"Couvertures\S2_Couv.jpg"
CreateFile(#File_0,Image2.s)
WriteData(#File_0,*buffer,PictureSize)
CloseFile(#File_0)
FreeMemory(*blobreadbuffer)
FinishDatabaseQuery(#Base_0)
EndProcedure 
Merci de vos conseils.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: PostgreSQL Blob image

Message par gnozal »

Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: PostgreSQL Blob image

Message par Droopy »

Postgre enregistre bien l'image dans la base de données et l'encode au passage.
Il faut décoder l'image pour la récupérer le base de données (enfin c'est ce que j'ai constaté)
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

Re: PostgreSQL Blob image

Message par fd »

Est ce qu'un adepte a réussi avec postgresql 9 ? Je remplis bien la base de donnée, mais probablement pas avec des images en tout cas elles ne sont plus lisibles.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: PostgreSQL Blob image

Message par Droopy »

Ce code fonctionne :

Code : Tout sélectionner

;/ PureBasic 4.51

;- Stockage de données binaires

Structure OneByte 
  a.b 
EndStructure 

Procedure Hex2Dec(HexNumber.s) 
  *t.OneByte = @HexNumber 
  Result.l = 0 
  While *t\a <> 0 
    If *t\a >= '0' And *t\a <= '9' 
      Result = (Result << 4) + (*t\a - 48) 
    ElseIf *t\a >= 'A' And *t\a <= 'F' 
      Result = (Result << 4) + (*t\a - 55) 
    ElseIf *t\a >= 'a' And *t\a <= 'f' 
      Result = (Result << 4) + (*t\a - 87) 
    Else 
      Result = (Result << 4) + (*t\a - 55) 
    EndIf 
    *t + 1 
  Wend 
  ProcedureReturn Result 
EndProcedure 

Procedure DecodePostgreBlob(BufferAdress,BuffLenght) ; Return the size of the buffer
  
  For n=0 To (BuffLenght-2)/2
    c.s=Chr(PeekB(BufferAdress+n*2+1))+Chr(PeekB(BufferAdress+n*2+2))
    PokeB(BufferAdress+n,Hex2Dec(c))
  Next
  
  ProcedureReturn (BuffLenght-2)/2
  
EndProcedure

;/ Création de la base de données
UsePostgreSQLDatabase()
If OpenDatabase(0, "host=172.16.16.135 port=5432 dbname=purebasic", "postgres", "root")
  Debug "Ouverture de base de données: Succès"
Else
  Debug "Ouverture de base de données: Echec"
  End
EndIf

If DatabaseUpdate(0,"CREATE TABLE Images ( Blob1_data BYTEA) ; ")=0
  Debug DatabaseError()
EndIf

;/ Lecture de l'image et mise en tampon
Image.s="d:\image1.bmp"
TailleImage=FileSize(Image)
Debug TailleImage
*buffer=AllocateMemory(TailleImage)
ReadFile(0,Image)
ReadData(0,*buffer,TailleImage)
CloseFile(0)

;/ Ecriture du tampon dans la base
SetDatabaseBlob(0,0,*buffer,TailleImage) ;/ Le 2° paramètre est le n° de la colonne ou sera le $x

If DatabaseUpdate(0, "INSERT INTO Images VALUES ($1);")=0
  Debug DatabaseError()
EndIf
FreeMemory(*buffer)
TailleImage=0

;/ Lecture de l'image dans le tampon
DatabaseQuery(0,"SELECT * FROM Images ;")
NextDatabaseRow(0)
TailleImage=DatabaseColumnSize(0,0) ;/ détermine la taille du binaire
Debug TailleImage
*buffer=AllocateMemory(TailleImage)
GetDatabaseBlob(0,0,*buffer,TailleImage)

;/ Décodage du tampon
TailleImage=DecodePostgreBlob(*buffer,TailleImage)

;/ Ecriture du tampon dans un fichier
image2.s="d:\image2.bmp"
CreateFile(0,image2)
WriteData(0,*buffer,TailleImage)
CloseFile(0)
FreeMemory(*buffer)

FinishDatabaseQuery(0)
CloseDatabase(0)
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

Re: PostgreSQL Blob image

Message par fd »

Cela ne fonctionne pas chez moi ... mais mes images sont en jpg.
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

Re: PostgreSQL Blob image

Message par fd »

Bonjour,

Je relance ce sujet car je n'ai toujours rien trouvé qui fonctionne. J'utilise donc pour l'instant une base locale sqlite pour les images et une base distante postgresql pour les autres données. Ce qui n'est pas très pratique.

Voici ma procédure en écriture de la base postgresql : #Base_1. Cette procédure transfère les images de la base sqlite (#Base_0) vers la base posgresql. la table contient ID = Integer et Affiche = bytea (pour postgresql) ou blob (pour sqlite). Les images à l'origine sont en jpg.

Code : Tout sélectionner

 
 If DatabaseQuery(#Base_0,"SELECT ID,Affiche FROM affiches") 
    While NextDatabaseRow(#Base_0) 
       Num = GetDatabaseLong(#Base_0, 0)
       TailleImage = DatabaseColumnSize(#Base_0,1) 
       If tailleimage <> 0
          *blobreadbuffer = AllocateMemory(tailleimage)
          GetDatabaseBlob(#Base_0, 0, *blobreadbuffer, tailleimage) 
          SetDatabaseBlob(#Base_1, 0, *blobreadbuffer, tailleimage)
          SQL.s = "INSERT INTO affiches(ID,affiche) VALUES ("+Str(Num)+", $1)"
          If DatabaseUpdate(#Base_1, SQL)
       Else
          MessageRequester("Erreur Base de données", "Ecriture affiches"+Chr(10)+DatabaseError(),0)
       EndIf  
       FreeMemory(*blobreadbuffer)
     EndIf
   Wend
 Else 
    MessageRequester("Erreur Base de données", "Lecture affiches"+Chr(10)+DatabaseError(), #MB_OK|#MB_ICONEXCLAMATION)
 EndIf
La procédure LireImage ci-dessous permet de relire les images et fonctionne avec SQLite, avec Postgresql c'est l'image de substitution qui s'affiche pourtant la valeur tailleimage n'est pas vide.

Code : Tout sélectionner

Procedure LireImage(Code.s)
DatabaseQuery(#Base_0,"SELECT Affiche FROM affiches WHERE ID = "+Code) 
FirstDatabaseRow(#Base_0) 
TailleImage = DatabaseColumnSize(#Base_0,0) 
If tailleimage <> 0
  *blobreadbuffer = AllocateMemory(tailleimage)
  GetDatabaseBlob(#Base_0, 0, *blobreadbuffer, tailleimage)   
  CatchImage(#Image_1, *blobreadbuffer)
  FreeMemory(*blobreadbuffer)
  If IsImage(#Image_1)
    SetGadgetState(#GadImage_0, ImageID(#Image_1))
   Else
    CopyImage(#Image_0,#Image_1)
    SetGadgetState(#GadImage_0, ImageID(#Image_1))  
  EndIf
Else
  CopyImage(#Image_0,#Image_1)
  SetGadgetState(#GadImage_0, ImageID(#Image_1)) 
EndIf 
FinishDatabaseQuery(#Base_0) 
EndProcedure 
Merci de votre aide.
Répondre