0

瘦客户端 URI 是一个 Web 地址,您可以在漂亮的 Web 用户界面上键入该地址以查看有关文件或文件夹的详细信息。

例如,我的 Android 应用程序使用 Alfresco 的 CMIS API,但对于复杂的操作(例如,在此文件上启动工作流),您可以单击一个链接,它会将您带到成熟的 Web 界面(由 Alfresco 提供服务器)。

对于任何 Alfresco 文件夹/文档,如何计算此瘦客户端 URI?

一个好的开始是使用CMIS 协议的 thinClientURI 特性。不幸的是,它仅适用于存储库的根目录。

一个完美的算法会在他们的 Alfresco Share 站点中显示 Alfresco Share 节点,而不是在 Share 的通用存储库浏览器中。

4

2 回答 2

2

Alfresco 确实有一个鲜为人知的功能,可以满足您的需求!我相信它是在 Enterprise 4.0.3ish 中实现的,为 4.1 做好了准备,到目前为止,它的主要用途是在 Cloud Sync 中。

您正在寻找的 webscript 是org.alfresco.repository.site.site-share-view-url.get,它公开为/api/sites/shareUrl?nodeRef=nodeRef. 它返回一段简单的 JSON,例如:

{
   "site": "alfresco-test",
   "url": "https:\/\/my.alfresco.com\/share\/test.com\/page\/site\/alfresco-test\/document-details?nodeRef=workspace:\/\/SpacesStore\/aae3b33fd-23d4-4091-ae64-44a8e332091341"
}

(以上示例取自 Alfresco 云版本,但它应该出现在 4.0 企业版后期、企业版 4.1 和社区 + 企业版 4.2 以后)

如果您想查看它支持哪些类型的内容,最好的办法是查看为其提供支持的 java 类,org.alfresco.repo.web.scripts.site.SiteShareViewUrlGet

但是,一个轻微的限制是它只支持位于站点内的节点。如果您有一个非站点节点,则必须自己为其计算存储库浏览器 URL...

于 2013-12-22T12:06:44.303 回答
0

下面是我目前的实现。
它(非常)远非完美,因为它仅适用于文件夹,并且仅适用于 Alfresco Share。

        string suffix1 = "alfresco/cmisatom";
        string suffix2 = "alfresco/service/cmis";
        if (repo.Address.AbsoluteUri.EndsWith(suffix1) || repo.Address.AbsoluteUri.EndsWith(suffix2))
        {
            // Detect suffix length.
            int suffixLength = 0;
            if (repo.Address.AbsoluteUri.EndsWith(suffix1))
                suffixLength = suffix1.Length;
            if (repo.Address.AbsoluteUri.EndsWith(suffix2))
                suffixLength = suffix2.Length;

            string root = repo.Address.AbsoluteUri.Substring(0, repo.Address.AbsoluteUri.Length - suffixLength);
            if (repo.RemotePath.StartsWith("/Sites"))
            {
                // Case of Alfresco Share.

                // Example RemotePath: /Sites/thesite
                // Result: http://server/share/page/site/thesite/documentlibrary
                // Example RemotePath: /Sites/thesite/documentLibrary/somefolder/anotherfolder
                // Result: http://server/share/page/site/thesite/documentlibrary#filter=path|%2Fsomefolder%2Fanotherfolder
                // Example RemotePath: /Sites/s1/documentLibrary/éß和ệ
                // Result: http://server/share/page/site/s1/documentlibrary#filter=path|%2F%25E9%25DF%25u548C%25u1EC7
                // Example RemotePath: /Sites/s1/documentLibrary/a#bc/éß和ệ
                // Result: http://server/share/page/site/thesite/documentlibrary#filter=path%7C%2Fa%2523bc%2F%25E9%25DF%25u548C%25u1EC7%7C

                string path = repo.RemotePath.Substring("/Sites/".Length);
                if (path.Contains("documentLibrary"))
                {
                    int firstSlashPosition = path.IndexOf('/');
                    string siteName = path.Substring(0, firstSlashPosition);
                    string pathWithinSite = path.Substring(firstSlashPosition + "/documentLibrary".Length);
                    string escapedPathWithinSite = HttpUtility.UrlEncode(pathWithinSite);
                    string reescapedPathWithinSite = HttpUtility.UrlEncode(escapedPathWithinSite);
                    string sharePath = reescapedPathWithinSite.Replace("%252f", "%2F");
                    return root + "share/page/site/" + siteName + "/documentlibrary#filter=path|" + sharePath;
                }
                else
                {
                    // Site name only.
                    return root + "share/page/site/" + path + "/documentlibrary";
                }
            }
            else
            {
                // Case of Alfresco Web Client. Difficult to build a direct URL, so return root.
                return root;
            }
        }
于 2013-12-20T10:33:57.333 回答