如何在Liferay中使用不同的文件存储和检索API?

时间:2012-10-15 20:51:06

标签: liferay-6

在开发Liferay portlet时,有时您会想要使用文件工件。例如,您可能希望拥有可配置的映像,或者让用户将文件附加到自定义服务实体的方法。

Liferay内置了几个API来解决这个问题。每个人如何使用?

1 个答案:

答案 0 :(得分:5)

以下是我可以考虑存储和检索文件的三种方法。


方法-1

<强>存储
使用DLStoreUtil中显示的question的方法。

<强>检索:
为此,您需要将文件作为流获取,然后使用以下代码将其发送到浏览器:

String path = fileName;
// if there is a directory then path would be
// String path = "mydirectory/mySubDirectory/" + fileName; // mydirectory/mySubDirectory/my_File_image_name.png

InputStream inputStream = DLStoreUtil.getFileAsStream(companyId(), CompanyConstants.SYSTEM, path);

long contentLength = DLStoreUtil.getFileSize(companyId(), CompanyConstants.SYSTEM, path);

String contentType = MimeTypesUtil.getContentType(fileName);

ServletResponseUtil.sendFile(request, response, fileName, inputStream, contentLength, contentType);

Liferay使用上述方法下载其Message Boards portlet的附件。您可以查看源代码here。我没有尝试过这个,但我想您可以在portlet的serveResource方法中编写此代码,然后提供resourceURL作为下载的URL或在<img>标记中使用它。


方法-2:使用DLAppService

如果使用此方法,则DLFileEntry表中将存在此文件的数据库条目,该文件也将显示在Documents & Media portlet中。

<强>存储
添加文件的示例代码:

FileEntry = DLAppServiceUtil.addFileEntry(repositoryId, folderId, sourceFileName, mimeType, title, description, changeLog, bytes, serviceContext);

您可以查看其他方法和类here

<强>检索:
这是answer中解释的。


方法-3:使用ImageLocalService(专门用于图像)

对于此方法,您需要将ImageID存储在某处以便以后检索图像。

<强>存储
以下是在liferay中添加/更新图像的方法:

// to Add an image
long imageID = 0;
imageID = CounterLocalServiceUtil.increment();
ImageLocalServiceUtil.updateImage(imageID, bytes);

// to update the same image, pass the existing Image ID
ImageLocalServiceUtil.updateImage(existingImageID, bytes);

<强>检索:

您可以在JSP中编写以下代码:

<img alt="My Image"
     id="myImgID"
     title="This my image stored in liferay"
     src="<%=themeDisplay.getPathImage()%>/any_string_will_do_?img_id=<%=myImageId%>&img_timestamp=<%=someTimestampOrRandomString %>" />

<强> 注意: img_timestamp=<%=someTimestampOrRandomString %>",此字符串是一个可选参数&amp;可以跳过。
这样使用浏览器每次刷新页面时都会从服务器而不是浏览器缓存中检索图像。

希望这有帮助。