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