Liferay blob data concept in portlet

Liferay Blob Data


A blob (alternately known as a binary large object, basic large object, BLOB, or BLOb) is a collection of binary data stored as a single entity in a database management system. Blobs are typically images, audio or other multimedia objects, though sometimes binary executable code is stored as a blob.


 Concept covered in this article:

  • Custom plugin portlet with upload capablity
  • Liferay Blob Data Concept
  • Use of Liferay Search Container to display all the uploaded files in row wise
  • Use of serveResource to display individual uploaded file
  • Liferay Blob Data by service.xml

Liferay Blob Data Concept:

i) To define blob data in service.xml use type=”Blob”. For example column name=”blobData” type=”Blob”

ii) Actual data uploaded is represented by class com.liferay.portal.kernel.dao.jdbc.OutputBlob

iii) Use com.liferay.portal.kernel.upload.UploadRequest to handle upload request.

iv) Use com.liferay.portal.kernel.util.MimeTypesUtil for getting the mime type of the uploaded file.

v) Use enctype=”multipart/form-data” in your form tag in the JSP code.

 

Code Details

service.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.2.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_2_0.dtd">
<service-builder package-path="com.proliferay.servicebuilder">
    <author>Hamidul Islam</author>
    <namespace>PROLIFERAY</namespace>
    <entity name="BlobDemo" local-service="true" remote-service="true">
        <column name="blobId" type="long" primary="true" />
        <column name="name" type="String" />
        <column name="mimeType" type="String" />
        <column name="blobData" type="Blob" />
    </entity>
</service-builder>
  • name: It stores the name of the uploaded file with file extension.
  • mimeType: Its the mime type of the uploaded file. For example application/pdf, image/jpeg etc.
  • bobData: Actual binary data which is uploaded

Upload interface code in JSP:

<portlet:actionURL var='uploadURL' name="upload" />

<aui:form name="fm" action="<%=uploadURL.toString()%>" method="post" enctype="multipart/form-data">
    <aui:input name="file" type="file" />
    <aui:button type="submit" value="Upload" />
</aui:form>

Display Uploaded Data in row wise:

<liferay-ui:search-container
    emptyResultsMessage="There is no data to display">
    <liferay-ui:search-container-results
        results="<%=BlobDemoLocalServiceUtil.getBlobDemos(
                        searchContainer.getStart(), searchContainer.getEnd())%>"
        total="<%= BlobDemoLocalServiceUtil.getBlobDemosCount() %>" />

    <liferay-ui:search-container-row
        className="com.proliferay.servicebuilder.model.BlobDemo"
        modelVar="aBlobDemo">

        <portlet:resourceURL var="viewURL">
            <portlet:param name="dataId"
                value="<%=String.valueOf(aBlobDemo.getBlobId())%>" />
        </portlet:resourceURL>
        
        <liferay-ui:search-container-column-text
            value="<%=String.valueOf(row.getPos() + 1)%>" name="Serial No" />
        <liferay-ui:search-container-column-text  href="<%=viewURL.toString() %>" property="name" name="File Name"  />
        <liferay-ui:search-container-column-jsp path="/action.jsp"
            align="right" />

    </liferay-ui:search-container-row>

    <liferay-ui:search-iterator />
</liferay-ui:search-container>

 

process action code for inserting data in database:

@ProcessAction(name = "upload")
    public void upload(ActionRequest actionRequest,
            ActionResponse actionResponse) throws SystemException,
            FileNotFoundException {

        /**
         * PortalUtil.getUploadPortletRequest used for getting upload request
         *
         * From the uploaded file get input stream
         */
        UploadRequest uploadRequest = PortalUtil.getUploadPortletRequest(actionRequest);
        
        
        /**
         * Get the uploaded file name with extension
         */
        
        String uploadedFileName = uploadRequest.getFileName("file");
        
        File file = uploadRequest.getFile("file");
        
        InputStream inputStream = new FileInputStream(file);
        /**
         * Below is the actual blob data
         */
        OutputBlob blobData = new OutputBlob(inputStream, file.length());

        /**
         * Create and set the primary key
         */
        long id = CounterLocalServiceUtil.increment(BlobDemo.class.getName());
        BlobDemo blobDemo = BlobDemoLocalServiceUtil.createBlobDemo(id);

        blobDemo.setName(uploadedFileName);
        blobDemo.setBlobData(blobData);
        blobDemo.setMimeType(MimeTypesUtil.getContentType(file));
        BlobDemoLocalServiceUtil.addBlobDemo(blobDemo);
    }

process action code to delete record:

    /**
     * This process action is for deleting record in the database
     */
    @ProcessAction(name = "delete")
    public void delete(ActionRequest actionRequest,
            ActionResponse actionResponse) throws PortalException,
            SystemException {
        long dataId = ParamUtil.getLong(actionRequest, "dataId");
        BlobDemoLocalServiceUtil.deleteBlobDemo(dataId);
    }

serveResource code to view uploaded file:

    /**
     * Here serveResource method is used for displaying blob data
     */
    @Override
    public void serveResource(ResourceRequest resourceRequest,
            ResourceResponse resourceResponse) throws IOException,
            PortletException {

        try {
            long dataId = ParamUtil.getLong(resourceRequest, "dataId");
            BlobDemo blobDemo = BlobDemoLocalServiceUtil.getBlobDemo(dataId);
            if (blobDemo != null) {
                Blob blob = blobDemo.getBlobData();
                byte[] binaryData = blob.getBytes(1, (int) blob.length());
                // resourceResponse.setContentType(blobDemo.getMimeType());

                resourceResponse.setContentType("application/application-download");
                resourceResponse.setProperty("Content-disposition","attachement; filename=" + blobDemo.getName());
                OutputStream o = resourceResponse.getPortletOutputStream();
                o.write(binaryData);
                o.flush();
                o.close();
                resourceResponse.flushBuffer();
            }

        } catch (Exception e) {

        }
    }

blob data in database

Download Source Code

About The Author

2 thoughts on “Liferay blob data concept in portlet”

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top