You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay 7.2 Asset Publisher ADT如何获取图片选择器的图片URL

解决方案

你遇到的问题是Liferay图片选择器字段存储的内容是序列化的JSON元数据,而非直接的URL,直接输出到src属性就会出现格式错乱。可以通过解析JSON元数据拼接URL解决,以下是两种可直接用的实现方案:


方案1:无需查询文件实体(推荐,无额外权限依赖)

直接从JSON元数据中提取所需字段拼接访问路径:

<#-- 引入JSON解析工具 -->
<#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactoryUtil") />

<#-- 定位字段并解析JSON -->
<#assign 
    imgElement = saxReaderUtil.createXPath("dynamic-element[@name='Imagean48']").selectSingleNode(curArticle.getDocument())
    imgMeta = jsonFactory.createJSONObject(imgElement.getStringValue())
    imgUrl = themeDisplay.getPortalURL() + "/documents/" + imgMeta.getString("groupid") + "/0/" + imgMeta.getString("name") + "/" + imgMeta.getString("uuid")
    imgAlt = imgMeta.getString("alt")!imgMeta.getString("name")
/>

<#-- 渲染图片标签 -->
<img src="${imgUrl}" alt="${imgAlt}" />

方案2:通过文件ID查询文件实体(适合需要额外文件信息的场景)

如果需要获取文件的大小、修改时间等更多属性,可以调用DLAppService查询文件实体:

<#-- 引入所需工具类 -->
<#assign 
    jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactoryUtil")
    dlAppService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")
/>

<#-- 定位字段解析并查询文件 -->
<#assign 
    imgElement = saxReaderUtil.createXPath("dynamic-element[@name='Imagean48']").selectSingleNode(curArticle.getDocument())
    imgMeta = jsonFactory.createJSONObject(imgElement.getStringValue())
    fileEntry = dlAppService.getFileEntry(imgMeta.getLong("fileEntryId"))
    imgUrl = themeDisplay.getPortalURL() + fileEntry.getPreviewURL(themeDisplay)
    imgAlt = imgMeta.getString("alt")!fileEntry.getTitle()
/>

<#-- 渲染图片标签 -->
<img src="${imgUrl}" alt="${imgAlt}" />

注意事项

如果模板运行提示找不到serviceLocator,需要进入后台:控制面板 > 系统设置 > 模板引擎 > 自由标记,将serviceLocator添加到「允许的变量名」列表中即可。

内容的提问来源于stack exchange,提问作者Chris Olzacki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 16:27:00