Utilizzo dei campi LOB di Oracle in ColdFusion


Molte appllicazioni richiedono di scrivere immagini al posto che sul server direttamente nel database, supponiamo di dover gestire una tabella di impiegati con la loro relativa immagine in formato fototessera.
Se dovessimo scrivere la fototessera in una cartella sul server dovremmo fare in modo che la cartella sia accessibile in scrittura dal server, dovremmo fare lo script per l’upload e dovremmo fare in modo di scrivere su DB le informazioni del percorso completo dell’immagine. Questo porterebbe ad uno spreco in termini di prestazione.

L’esempio che tratto in questo articolo ci permetter√† di leggere un’immagine da disco (per semplicit√† di codice non ho fatto la procedura di upload), di scriverla su DB e poi di rileggerla e di scriverla all’interno del file system sul server.

Creazione della tabella con campo tipo clob

create table clob_test(
id number,
clob_col clob
primary key(id))

In questo esempio do per scontato che il campo id sia creato automaticamente da una sequenza ed un trigger su Oracle, per maggiori informazioni su come fare un campo autoincrement in oracle clickare qui
Il campo che conterr√† l’immagine √® il campo clob_col di tipo clob (acronimo di Chatacter Large OBject) a questo punto vi sarete gi√† accorti di un’incongruenza, un’immagine √® in formato binario, esatto, questo fa si che il trasferimento tra cold Fusion ed oracle di un oggetto binario non sia sempre cos√¨ facile, per ovviare al problema, faremo in modo di convertire l’immagine da formato binario a formato carattere e poi di riconvertirla al momento della lettura.
Adesso che la nostra tabella √® stata creata andiamo a leggere l’immagine:

Lettura del file

<cffile action = “readbinary”

¬†¬†¬†file = “c: empimage.jpg”
¬†¬†¬†variable=”image_blob”>

Scrittura all’interno del database
adesso che abbiamo la variabile image_blob possiamo scriverla direttamente dentro al DB, da notare che untilizziamo cfqueryparam e che convertiamo l’immagine con la funzione toBase64()

<cfquery name=”inserimento”
¬†¬†¬†datasource=”DSN”
¬†¬†¬†username=”nomeUtente”
¬†¬†¬†password=”Pwd”&gt

   insert into
      clob_test
   values
      (<cfqueryparam value=#toBase64(image_blob)#
¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†CFSQLType=”CF_SQL_CLOB”>)
</cfquery>

Ora la nostra immagine √® nel database, se proviamo ad interrogare il database, otterremo una versione “carattere” dell’immagine, la grandezza dell’immagine in byte √® simile alla lunghezza del campo, utilizzando questa query dovremmo essere in grado di capire le dimensioni dell’immagine:

select
dbms_lob.getlength(clob_col)
from
clob_column

Il risultato ottenuto √® molto vicino alla reale dimensione dell’immagine, questo perch√® l’immagine √® stata convertita in base64.

Estraiamo l’immagine e scriviamo su disco
Ovviamente per leggere l’immagine basta una semplice interrogazione, mentre per scriverla sul filesystem del server dobbiamo utilizzare la funzione toBinary(), ecco il codice:

<cfquery name=”rtrImmagine”
¬†¬†¬†datasource=”DSN”
¬†¬†¬†username=”nomeUtente”
¬†¬†¬†password=”Pwd”>

   select
       from
   clob_test
      where id=1
</cfquery>

<cffile action = “write”
¬†¬†¬†file = “c:image.jpg”
   output=#toBinary(select_clob.clob_col[1])#
¬†¬†¬†addnewline=”no”>

Utilizzo dei campi LOB di Oracle in ColdFusion ultima modifica: 2004-12-23T00:00:00+00:00 da Enrico

Comments are closed.