3

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

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

4

1 回答 1

5

以下是我能想到的三种存储和检索文件的方法。


方法一

存储:
使用DLStoreUtil您在问题中显示的方法。

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

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 Boardsportlet 下载附件。你可以在这里查看源代码。我没有尝试过,但我想您可以在serveResource您的 portlet 的方法中编写此代码,然后提供resourceURL作为 URL 下载或在<img>标记中使用它。


方法二:使用DLAppService

如果您使用此方法,则该文件的DLFileEntry表中将有一个数据库条目,并且该文件也将出现在Documents & Mediaportlet 中。

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

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

您可以在此处查看其他方法和类。

检索:
如this 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 %>" , 此字符串是可选参数 & 可以跳过。
这是为了让浏览器在每次刷新页面时从服务器而不是浏览器缓存中检索图像。

希望这可以帮助。

于 2012-10-17T05:56:42.190 回答