Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

Liferay 6.1 mit Spring 3.2 : Programmatisches Hochladen von Dateien in Dokumentenbibliothek

Das pro­gram­ma­ti­sche Hochladen von Dateien in die Dokumentenbibliothek, mit den Hilfsmitteln die durch Spring zur Verfügung gestellt wer­den, ist nicht ohne Weiteres mit Liferay mög­lich. Dieser Beitrag zeigt wie ein Dateiupload in das Liferay Portal im eige­nen Portlet umge­setzt wer­den kann. 

Mit Begriff "pro­gram­ma­tisch" ist hier die Nutzung eines Weges mit "Standard-Mitteln" gemeint, wel­cher ansons­ten durch Spring ver­ein­facht wird. Darunter fällt die Spring Annotation “@ModelAttribute”, die das Verknüpfen der Request-Parameter mit einem defi­nier­ten Modell über­nimmt. Im Zusammenhang mit einem Dateiupload-Request tritt das Problem auf, dass die Parameter des Requests für den Dateiupload nicht an das Modell gebun­den wer­den und somit “null” sind.
Aus die­sem Grund schlägt eine Validierung über die JSR-303 Bean Validierung mit der Annotation “@Valid” fehl, weil den zu über­prü­fen­den Variablen kei­nen Wert zuge­wie­sen wird.

JSP

Innerhalb der JSP muss ein Formular hin­zu­ge­fügt wer­den, wel­ches das “enc­type” Attribute mit dem Wert “multipart/form-data” benötigt.

<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<portlet:defineObjects />

<portlet:actionURL var="exampleUrl">
    <portlet:param name="action" value="example"></portlet:param>
</portlet:actionURL>

<form:form id="exampleForm" method="POST" action="${exampleUrl}" enctype="multipart/form-data" >
    <!-- elements -->
</form:form>

Daneben muss es im Formular ein Element vom Typ “file” geben, um die ent­spre­chende Datei über das Eingabefenster des Browsers aus­zu­wäh­len wel­che hoch­ge­la­den wer­den soll.

<form:input id="file" type="file" path=”fileName" />

Controller

Im Controller wird über die bereit­ge­stellte Funktion "getUploadPortletRequest" der PortalUtil der UploadPortletRequest aus dem ActionRequest erzeugt. Das File Objekt kann direkt über "getFile" geholt werden.

 @ActionMapping(params = "action=example")
 public void example(
 ActionRequest actionRequest,
 ActionResponse actionResponse) throws Exception {
    UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(actionRequest);
    File file = uploadPortletRequest.getFile("fileName");
    String fileName = uploadPortletRequest.getFileName("fileName");

     if (file == null || !file.exists()) {
        // handle not existing file 
        return;
    }

    ThemeDisplay themeDisplay = (ThemeDisplay) uploadPortletRequest.getAttribute(WebKeys.THEME_DISPLAY);

    long companyId = themeDisplay.getCompanyId();
    long repositoryId = CompanyConstants.SYSTEM;

    String folder = "exampleFolder"; 
    String fileFullName = folder + "/" + fileName;

    DLStoreUtil.addDirectory(companyId, repositoryId, folder);
    DLStoreUtil.addFile(companyId, repositoryId, fileFullName, file);
}

Related Posts

Pin It on Pinterest