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:
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>
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) { } }
By continuing to use the site, you agree to the use of cookies. more information
The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.
Why not display blob data?
Have you had success in inserting BLOB in Liferay 6.1 ?