
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) {
ย ย ย ย ย ย }
ย ย ย }



Why not display blob data?
Have you had success in inserting BLOB in Liferay 6.1 ?