Per consentire ad un utente di scaricare un file della Document Library è sufficiente creare un link che punta alla URL generata dal metodo DLUtil.getDownloadURL()
delle API di portale.
Trattandosi di API di portale, questi metodi sono completamente integrati all'interno del Permission Framework e pertanto controllano se l'utente possiede o meno i permessi per scaricare il file (eventualmente forzandone il login).
Tuttavia può accadere che sia necessario dover consentire all'utente di scaricare lo stesso un file per il quale non abbia i permessi; non entro nel merito etico della cosa e vediamo quindi come fare. L'idea alla base di tutto è piuttosto semplice: anzichè demandare a Liferay la gestione del download, si realizza tutto custom leggendo direttamente lo stream di byte del file e restituendolo al browser.
Per prima cosa occorre inserire in pagina una semplice ResourceURL che si occupa di innescare il download del file:
<liferay-portlet:resourceURL id="downloadFile" var="downloadFileURL">
<liferay-portlet:param name="fileEntryId" value="<%=String.valueOf(fileEntry.getPrimaryKey()) %>" />
</liferay-portlet:resourceURL>
<a href="<%=downloadFileURL %>"><%=fileEntry.getFileName() %></a>
Una volta fatto questo è sufficiente implementare il codice applicativo, all'interno del metodo serveResource
della portlet:
if ("downloadFile".equals(resourceID)) {
long fileEntryId = ParamUtil.getLong(resourceRequest, "fileEntryId");
try {
FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
InputStream inputStream = DLFileEntryLocalServiceUtil.getFileAsStream(
fileEntry.getPrimaryKey(), fileEntry.getVersion());
PortletResponseUtil.sendFile(
resourceRequest,
resourceResponse,
fileEntry.getTitle(),
inputStream,
(int) fileEntry.getSize(),
fileEntry.getMimeType());
} catch (PortalException e) {
e.printStackTrace();
}
}