mercoledì 15 ottobre 2008

Caricare immagini da un database

Il seguente metodo legge una immagine memorizzata come BLOB in un database PostgreSQL (tipo di dato OID) e la converte in un'immagine Java.
L'idea è quella di avere una classe Person che memorizza le informazioni di una persona, fra le quali la propria immagine. La classe mantiene una variabile image che funge da cache per l'immagine della persona: se l'immagine è già stata caricata essa non viene riletta dal database per motivi di efficienza.
Il metodo getImage() carica l'immagine dal database. Al di là delle operazioni preliminari, specifiche di un framework e comunque riconducibili facilmente a JDBC, il metodo ottiene il ResultSet relativo all'immagine, e da questo preleva il BLOB dell'immagine. Tale blob viene poi usato per ottenere lo stream di input dell'immagine. Tale stream viene passato alla classe ImageIO, utilizzata appunto per caricare una immagine da uno stream di byte.

   
/**
* The image of this person.
*/
private Image image = null;

/**
* Returns the image of this person.
* @return the image of the person
*/
public synchronized Image getImage(){
// do I have already loaded an image?
if( this.image != null )
return this.image;

// if here the image is not yet loaded, so load it from the database
try{
Logger.debug("Start loading the image of the person " + this.personPK);

String sql = "SELECT image FROM person WHERE personpk=? AND image IS NOT NULL";
Object params[] = {this.personPK};
Database database = Database.getInstance();
database.initTransaction();
ResultSet rs = database.query(sql, params);

while( rs != null && rs.next() ){
Blob imageBlob = rs.getBlob("image");
long size = imageBlob.length();

byte[] imageBytes = imageBlob.getBytes(1, (int) size);
Logger.debug("the image has size in bytes: " + size);
this.image = ImageIO.read( new ByteArrayInputStream(imageBytes));


}

// all done
Logger.debug("end loading image");
database.commit();




return this.image;

}catch(DatabaseException e){
Logger.exception("Exception caught while loading a person's image", e);
return null;
} catch (SQLException e) {
Logger.exception("Exception caught while loading a person's image", e);
return null;
} catch (IOException e) {
Logger.exception("Exception caught while loading a person's image", e);
return null;
}

}

Nessun commento: