解构文档和媒体下载URL



我想跟踪从Document and Media下载的所有文件,所以我编写了一个Servlet Filter,在下载文件时获取URL。根据文件在UI中的下载位置,它可能如下所示:

http://s/documents/20143/32701/SomeFile.txt/da99a46a-8231-2a87-ff8d-8d3b2d388c24
http://s/documents/20143/0/invoice_ABC.pdf/c44fd479-331b-f393-7879-973c5cecf086

在我的审计中,我想写下下载文件的详细信息,所以我需要从该URL中提取信息。

URL的每一部分是用来做什么的?

注意:我知道按这种顺序依赖这些参数是危险的,但在进行审计时,我认为没有更好的选择,因为下载背后的Java代码不能被OSGi模块覆盖

  • http://s:显然是您的协议和服务器名称
  • documents:一个关键词,它总是一样的

下面是一条最多包含四个部分的路径。根据零件的数量,它们可能有不同的含义:

  • http://s/documents/80327

    • 80327:文件快捷方式的ID(DLFileShortcut.fileShortcutId)
    • 文件条目可以使用以下内容找到:DLAppServiceUtil.getFileEntry(DLAppServiceUtil.getFileShortcut(80327).getToFileEntryId())
  • http://s/documents/20143/da99a46a-8231-2a87-ff8d-8d3b2d388c24

    • 20143:文件条目所属站点/组的ID(DLFileEntry.groupId)
    • da99a46a-8231-2a87-ff8d-8d3b2d388c24:文件条目的UUID(DLFileEntry.uuid)
    • 文件条目可以使用以下内容找到:DLAppServiceUtil.getFileEntryByUuidAndGroupId("da99a46a-8231-2a87-ff8d-8d3b2d388c24", 20143)
  • http://s/documents/20143/32701/SomeFile.txt

    • 20143:文件条目所属站点/组的ID(DLFileEntry.groupId)
    • 32701:文件条目所属文件夹的ID(DLFileEntry.folderId)
    • SomeFile.txt:文件名,带有编码为URL转义序列的特殊字符(DLFileEntry.name)
    • 文件条目可以使用以下内容找到:DLAppServiceUtil.getFileEntry(20143, 32701, HttpUtil.decodeUrl("SomeFile.txt"))
  • http://s/documents/20143/32701/SomeFile.txt/da99a46a-8231-2a87-ff8d-8d3b2d388c24

    • 20143:文件条目所属站点/组的ID(DLFileEntry.groupId)
    • 32701:文件条目所属文件夹的ID-已忽略
    • SomeFile.txt:文件名-已忽略
    • da99a46a-8231-2a87-ff8d-8d3b2d388c24:文件项的UUID。(DLFileEntry.uuid)
    • 文件条目可通过以下方式找到:DLAppServiceUtil.getFileEntryByUuidAndGroupId("da99a46a-8231-2a87-ff8d-8d3b2d388c24", 20143)

Liferay通常会生成最后一种格式的URL,以具有或多或少"友好"的URL,该URL可以防止移动或重命名文件。

一个值得注意的缺失是公司id,它可以从DLFileEntry.companyIdGroup.companyId中检索。

警告:元素及其顺序将来可能会更改。当前的实现可以在com.liferay.portal.webserver.WebServerServlet.getFileEntry(String[] pathArray)中找到。

这是一个社区wiki答案,所以可以随意编辑它来添加/修复信息

最新更新