Lavorando con le proprie entity custom può capitare di dover manipolare delle immagini e, come spesso succede, di dover creare delle miniature di tali immagini.
Chiaramente è sempre possibile creare tutto a mano e salvarlo poi nella document library, ma perchè farlo quando Liferay è in grado di farlo al posto nostro?
La soluzione è incredibilmente semplice ma richiede alcune spiegazioni:
ImageProcessorUtil.generateImages(fileVersion);
Innanzitutto... cos'è fileVersion?
Si tratta di un oggetto che contiene alcune meta informazioni sulla nostra immagine (o meglio, sul file generico contenuto nella Document Library) e lo possiamo ottenere nel seguente modo attraverso le classi di utility della Document Library:
DLFileEntry
imageDLFileEntry = DLFileEntryLocalServiceUtil....
long fileVersionId = imageDLFileEntry.getFileVersion()
.getFileVersionId();
FileVersion fileVersion = DLAppLocalServiceUtil.getFileVersion(
fileVersionId
);
Ecco, questo è tutto il codice che deve essere scritto. Ma poi, cosa succede?
Succede che Liferay ricava da fileVersion tutte le informazioni sull'immagine e tenta di generare 3 distinte miniature: quella di default e 2 custom. Sì ok, ma le dimensioni dove le imposto?
Le dimensioni si possono impostare sovracrivendo alcune property di portale, in particolare:
dl.file.entry.thumbnail.max.height=128
dl.file.entry.thumbnail.max.width=128
dl.file.entry.thumbnail.custom1.max.height=200
dl.file.entry.thumbnail.custom1.max.width=200
dl.file.entry.thumbnail.custom2.max.height=250
dl.file.entry.thumbnail.custom2.max.width=250
Volendo, le dimensioni di default si possono anche impostare direttamente dal pannello di controllo di Liferay, nella sezione Server -> File Upload.
Ricordate che le dimensioni non rappresentano l'altezza e larghezza esatta della miniatura, ma le dimensioni massime ossia quelle del riquadro all'interno del quale verrà visualizzata la miniatura; quindi non ci sono problemi di deformazioni perchè l'immagine viene scalata per rientrare nel riquadro.
Quindi quello che succede è che Liferay va a cercare i valori di queste property e se sono diversi da zero, genera una miniatura per ogni tipo e la salva nella Document Library.
Bello! Ma adesso come le visualizzo? Anche questo è abbastanza semplice!
Innanzitutto dobbiamo generare l'indirizzo completo dell'immagine originale e lo facciamo attraverso le solite librerie di Liferay:
String imageUrl = DLUtil.getPreviewURL(
DLAppLocalServiceUtil.getFileEntry(fileEntry.getFileEntryId()),
null,
themeDisplay,
StringPool.BLANK,
false,
true);
Il significato dei parametri è il seguente:
- DLAppLocalServiceUtil.getFileEntry(fileEntry.getFileEntryId()), serve per recuperare dalla Document Library l'immagine;
- null, rappresenta la versione del file ma a noi interessa l'ultima e lo mettiamo a null;
- themeDisplay, come farselo mancare?
- StringPool.BLANK, parametri aggiuntivi della queryString;
- false, non vogliamo che nella URL venga aggiunto il numero di versione;
- true, vogliamo una URL assoluta.
La chiamata sopra genera una URL simile alla seguente:
http://localhost:8080/documents/15067/28230/filename.jpg/
67979c90-ab51-42ed-b3c8-d3721dfafecd
Inserendo la URL in un browser potremmo vedere l'immagine grande. E la miniatura?
Per visualizzare la miniatura è sufficiente aggiungere un parametro alla URL:
String thumbUrl = HttpUtil.addParameter(imageUrl, "imageThumbnail", 1);
Il parametro imageThumbnail serve proprio a richiedere a Liferay di fornirci la miniatura, e può assumere 3 valori distinti:
- 1, per visualizzare la miniatura di default;
- 2, per visualizzare la miniatura custom1;
- 3, per visualizzare la miniatura custom2.
Ad esempio (lo spezzo per motivi tipografici):
http://localhost:8080/documents/15067/28230/filename.jpg/
67979c90-ab51-42ed-b3c8-d3721dfafecd?imageThumbnail=1
Enjoy!