I cookie ci aiutano a fornire i nostri servizi.

Utilizzando tali servizi, accetti l'utilizzo dei cookie da parte nostra. Per saperne di piu'

Approvo

Sicuramente vi sarà capitato di dover definire un'entità custom nel Service Builder a cui associare un'immagine, come ad esempio un'icona o un'immagine di copertina.

Generalmente, in questi casi, si inizia a lavorare alacremente sulla Document Library creando cartelle, sotto cartelle, permessi vari e cercando di gestire correttamente tutto il flusso di creazione ed aggiornamento dell'immagine stessa.

Ma per fortuna, ancora una volta, le API di Liferay ci vengono in aiuto semplificandoci la vita!

La prima cosa da fare è definire la nostra entità custom all'interno del file service.xml avendo l'accortezza di aggiungere tutti i campi di tipo immagine di tipo long; questo è necessario perché chiaramente andremo a salvare solamente la chiave primaria dell'immagine.

Sottolineo anche il fatto di avere detto tutti i campi di tipo immagine, perché il sistema che sto per illustrarvi non è limitato ad una sola immagine; l'importante è definire un campo dell'entità per ogni immagine da associare all'entità stessa.

Supponiamo quindi di aver definito un'entità Book a cui vogliamo associare un'immagine per la copertina: andremo quindi a definire il campo del service.xml nel seguente modo:

<column name="coverImageId" type="long" /> 

Il grosso del lavoro è finito; infatti per gestire l'immagine (tipicamente nella classe *LocalServiceImpl) sarà sufficiente invocare un unico, semplice metodo:

PortalUtil.updateImageId(
    BaseModel<?> baseModel,
    boolean hasImage,
    byte[] bytes,
    String fieldName,
    long maxSize,
    int maxHeight,
    int maxWidth)
throws PortalException;

Tutto il lavoro sporco sarà svolto dal metodo in base al valore dei parametri passati:

  • baseModel, rappresenta l'istanza dell'oggetto a cui associare l'immagine (nel nostro caso sarà un oggetto di tipo Book);
  • hasImage, se vale false l'immagine corrente viene cancellata dal portale ed il campo dell'entità viene impostato a 0; altrimenti l'immagine viene caricata sul portale ed il campo dell'entità viene impostato al valore della chiave primaria dell'immagine caricata;
  • bytes, rappresenta l'immagine da caricare nel portale (può valere null);
  • fieldName, nome del campo dell'entità in cui salvare la chiave primaria dell'immagine (nel nostro caso sarà coverImageId);
  • maxSize, dimensione massima (in bytes) ammessa per l'immagine;
  • maxHeight, altezza massima (in pixel) dell'immagine; se il valore è maggiore di 0 l'immagine viene ridimensionata al caricamento;
  • maxWidth, larghezza massima (in pixel) dell'immagine; se il valore è maggiore di 0 l'immagine viene ridimensionata al caricamento.

Ecco alcuni esempio di invocazione:

Book book = ...

// Aggiunta/modifica dell'immagine
PortalUtil.updateImageId(book, true, bytes, "coverImageId", 0, 0, 0);

// Rimozione dell'immagine PortalUtil.updateImageId(book, false, null, "coverImageId", 0, 0, 0);
// Aggiunta/modifica dell'immagine con ridimensionamento PortalUtil.updateImageId(book, true, bytes, "coverImageId", 0, 640, 480);

Ma l'immagine dove viene salvata esattamente?

Se vi interessa davvero saperlo date un'occhiata la metodo ImageLocalServiceImpl.updateImage ma l'immagine finisce comunque nella Document Library in una sezione nascosta non visibile agli utenti; i dati dell'immagine sono invece censiti nella tabella Image.

Bello! Ma poi come posso visualizzare l'immagine?

In questo caso è sufficiente creare una stringa nel modo seguente:

long imageId = book.getCoverImageId();
String url = "/image/logo?image_id=" + imageId + "&t=" + WebServerServletTokenUtil.getToken(imageId);

La magia è fatta dal percorso /image mappato in una servlet di portale; invece il secondo pezzo /logo in realtà potete personalizzarlo come volete.