Immagine in field postgreesql

Nuovamente Buona Sera a tutti …
sono qui oggi per un problemone… st convertendo la mia app da mysql a postgreesql, a parte qualche piccolo problema relativo alle query di selezione e aggiornamento non ho riscontrato quasi nessun problema insormontabile…
Tranne che per lo storing di immagini in record di tipo BYTEA ( l’equivalente del campo di tipo BLOB o LONGBLOB di mysql )

Purtroppo non riesco a leggere e nemmeno a scrivere nel campo e quindi a visualizzare l’immagine;
prima con mysql utilizzavo due funzioni ; la prima per scrivere il file immagine in campo BLOB, la seconda per leggere i dati dal campo BLOB e visualizzare l’immagine.

Function PictureToString(p as picture) As string
  If p=Nil Then Return ""
  Return EncodeBase64(p.GetData(Picture.FormatJPEG))
End Function

....

Function StringToPicture(data as string) As picture
  '// Converti una stringa o BLOB di database in immagine
  Dim p As picture
  If data="" Then Return Nil
  p=picture.FromData(DecodeBase64(data))
  Return p
End Function

Ho letto qui sul forum di una tecnica che viene utilizzata con postgresql per scrivere e leggere i campi BYTEA ( splittandoli ovviamente in un file esterno ) che si chiama ‘LargeObject’
Ho anche visto l’esempio di xojo nella cartella database … ma davvero, devo aver proprio la testa malata, non ci capisco nulla…

In pratica i largeObject stanno in una tabella unica, ognuno con il suo id.
Questo per superare una limitazione nella dimensione dei dati che puoi registrare su Postgres.
Quindi quando salvi, crei il tuo oggetto e scrivi
Quando leggi, ottieni l’oggetto e lo leggi.

Il dato pu essere qualsiasi per cui non necessario fare l’encoding/decoding base64, ma nel caso di immagini puoi scrivere direttamente il p.getData e leggere picture.fromData.

Ovviamente fai tutti i controlli che le singole operazioni vadano a buon fine e ricordati che le operazioni, come scritto anche nella documentazione, vanno dentro una transazione

Antonio Grazie…
Luciano Monti mi ha suggerito di utilizzare un campo di tipo testo;
le funzioni che ho postato sopra poi funzionano come prima appunto con un campo di tipo testo.
Magari non elegante ma funziona.

Poi quando ho tempo provo comunque la metodologia che mi hai consigliato.

Tieni conto che dipende molto dalle dimensioni del file che “alleghi”.

Se il file molto grande metterlo nella riga non la soluzione ideale ed il motivo per cui hanno creato i largeObject
Chiaramente questi costringono a cambiare strategia per le query di lettura e per salvare i dati.

In pratica per salvare devi:
creare una transazione
ottenere un id dell’oggetto
salvare l’oggetto
inserire l’id nella colonna relativa della tabella
salvare la riga
se tutto ok chiudere la transazione o fare il rollback

Per modificare non esiste un modo diretto da Xojo di azzerare il contenuto per cui devi:
creare una transazione
eliminare il vecchio oggetto (id relativo nella tabella)
ottenere un nuovo id
salvare l’oggetto
inserire il nuovo id nella colonna relativa della tabella
salvare la riga
se tutto ok chiudi la transazione o fail il rollback

Per richiedere puoi usare la funzionalit loread nella query, ma se i file sono grandi potresti mettere in crisi la comunicazione con il server per cui in questo caso sarebbe consigliabile utilizzare una lettura differita.

Lo scenario di utilizzo ideale (scrittura e lettura differita) quello dell’archiviazione documentale su db. In questo caso in pratica il dato non lo leggi mai se non in casi particolari (devo avere il documento)

Se i tuoi dati non sono grandi la soluzione di Luciano usabile, in ogni caso ti consiglio qualche stress test e verificare l’integrit e la velocit del db dopo aver inserito/modificato/cancellato tanti dati.

I can’t read Italiano…
But in Postgresql I store images as encodebase64 in a TEXT field.
Additional benefit: my reeport-generator can work with it right a way to show pics in reports.

Use this function work fine … but limit the image size at 512 kbyte max

Function PictureToString(p as picture) As string
  If p=Nil Then Return ""
  Return EncodeBase64(p.GetData(Picture.FormatJPEG))
End Function

....

Function StringToPicture(data as string) As picture
  '// Converti una stringa o BLOB di database in immagine
  Dim p As picture
  If data="" Then Return Nil
  p=picture.FromData(DecodeBase64(data))
  Return p
End Function