4

在过去的 2 年里,我一直在使用 Liferay,但我从来不需要任何广泛的文档管理。

现在我有一个 portlet,用户可以在其中上传文档(MS office OLE2 文档、ODS 文档、PDF 等),我必须使用所有可用的元数据来保存它们。

我知道在不使用 Liferay 的情况下如何做到这一点,我可能会使用 Apache solr 和 Apache Tika(UpdateRichDocumentsExtractingRequestHandler)或在后台使用 Apache Tika 的 Apache Jackrabbit(org.apache.jackrabbit.extractor.*)。

问题是,如果我查看 Liferay 的主干,有一些关键类:

Hooks (JCRHook, FileSystemHook, CMISHook, s3Hook)DLLocalServiceImpl直接从内部雇用

另一种选择是使用 DLAppLocalServiceImpl它,DLRepositoryLocalServiceImpl并且文件也通过 Hooks 持久化到存储库中,但是在那里完成了很多额外的工作。

  1. Liferay 中没有 jackrabbit-text-extractors 库,所以我想如果我想从 PDF、DOC、ODS 文档中提取元数据,我会很难过……因为 DL 服务层不接受附加属性

    1. 我想我必须避免使用 DL 服务和 JCR 挂钩并直接访问 Jackrabbit ......但我会失去兼容性和迁移我的存储库等的可能性。

请问有人可以合作吗?谢谢

4

4 回答 4

2

SOLR 用于索引,Jackrabbit 用于文档存储。在代码中管理 Liferay 文档库相当容易,只需查看 DL*LocalServiceUtil 类,即DLFolderLocalServiceUtilDLFileLocalServiceUtil. 默认情况下,Liferay 只是在硬盘驱动器上创建一个匹配的文件夹/文件结构(名称已更改),因此您只需要编写代码或使用 Jackrabbit 如果您想要更多,因为 Liferay 允许开箱即用地上传/下载和查看通过控制面板和各种 portlet。

我没有将 JackRabbit 与 Liferay 一起使用,但是一旦配置好,一切都应该在幕后进行管理,你不需要在前端担心它。

当您说“所有元数据都可用”时,我不确定保留了什么,但除了重命名文件以便可以跟踪它之外,不应该有任何其他更改。LIFERAY/data/document_library通过上传每种类型的文件并检查目录和子目录中的条目,应该可以快速轻松地进行测试。如果使用 Jackrabbit,这又会有所不同。

于 2011-02-28T03:55:13.697 回答
1

我想这两项服务都很重要DLLocalServiceImplDLAppLocalServiceImpl前一个如果用于直接访问存储库。请注意,通过此服务添加文件时,您需要将相应的 DlFileEntry 持久化到数据库中,然后引用 addFile(...., fileEntryId, ...)。

后一项服务正在为您做额外的事情,主要是资产管理和工作流程。

关于您的用例,我会避免使用文档库,因为没有元数据可以进入 JCR 存储库。实际上,只有您可以存储的元数据/自定义属性才是Liferay 门户的custom propertiesAKAExpando功能。

对你来说最好的方法似乎是实现你自己的 jackrabbit 挂钩来将数据存储到存储库中,并让 Liferay 文档库使用该存储库。

于 2011-03-21T14:18:51.673 回答
0

认为埃德加是正确的。如果您通过http://svn.liferay.com/repos/public/portal/trunk/portal-service/src/com/liferay/documentlibrary/service/DLLocalService.java检查当前主干(以访客身份登录且无密码) ,您将不再找到 DLFolderLocalServiceUtil 类。我们也在使用现有的 DLFolderLocalServiceUtil 类。感谢您的提醒。我们将重构我们的代码,以便在 6.1 到来时我们仍然可以使用 DocumentLibrary 服务。

于 2011-03-17T06:50:45.850 回答
0

您需要始终使用 DLAppServiceUtil (正如 Liferay 专门指示的那样)。这是我将文件保存到 CMS 的工作代码:

public static void saveFileToCMS(ActionRequest aReq, long groupId, String fileName, File filenameWithPath) {
    try {
        ServiceContext serviceContext = ServiceContextFactory.getInstance(
                Group.class.getName(), aReq);

        // prevents duplicate entries based on unique title name
        Random rand = new Random();
        Integer suffix = new Integer(rand.nextInt(10000));

        DLAppServiceUtil.addFileEntry(groupId, 0, fileName, "application/vnd.ms-excel",
                fileName + suffix.toString(), "description goes here", "changelogname",
                filenameWithPath, serviceContext);

        //log.info("Successfully added the new file");

    } catch (PortalException pe) {
        log.error("Portal Exception occurred while saving file to CMS");
        pe.printStackTrace();
    } catch (SystemException e) {
        log.error("System Exception occurred while saving file to CMS");
        e.printStackTrace();
    }
}
于 2013-08-21T13:34:38.287 回答