bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Scaricare un file della Document Library bypassando i permessi

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();
    }
}
Commenti
Nessun commento. Vuoi essere il primo.