我想跟踪从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.companyId
或Group.companyId
中检索。
警告:元素及其顺序将来可能会更改。当前的实现可以在com.liferay.portal.webserver.WebServerServlet.getFileEntry(String[] pathArray)
中找到。
这是一个社区wiki答案,所以可以随意编辑它来添加/修复信息