Apex 5.1报表无法显示数据库存储图片,显示字符串如何解决?
问题排查与解决方案
核心原因
Apex 5.1默认将报表列内容按纯文本解析,导致你生成的HTML字符串直接显示为文本而非渲染成图片。必须调整报表列的属性,让Apex识别并解析HTML内容。
步骤1:修改报表列显示属性
- 打开Apex 5.1的报表页面编辑界面
- 定位到PHOTO列的属性设置
- 在「列属性」的「显示」板块,将类型从默认的「文本」改为HTML表达式;或找到「Escape特殊字符」选项,设置为否
- 保存设置后刷新报表,图片即可正常渲染
步骤2:验证APEX_UTIL.GET_BLOB_FILE_SRC参数正确性
确认P46_PHOTO是对应页面上文件浏览项的正确标识:
- 检查页面46(若P46为页面编号)是否存在名为
P46_PHOTO的文件上传项,且该项绑定的表列是COM_ADVERT_TB.PHOTO - 若页面编号不符,替换为实际包含文件上传项的页面ID,格式为
'P<页面号>_<项名>'
优化查询代码(可选)
原查询中GROUP BY子句重复了完整的DECODE表达式,冗余且易出错,可改用子查询重构简化代码:
SELECT m.ID, m.CATEGORY_ID, S.CATEGORY_NAME, e.name || ' ' || e.surname AS FULL_NAME, m.CONTACT_DETAILS, m.IS_ACTIVE, M.UPDATED_ON, m.UPDATED_BY, M.CREATED_ON, m.DESCRIPTION, r.REPLIES, CASE WHEN NVL(DBMS_LOB.GETLENGTH(m.PHOTO), 0) > 0 THEN '<img onclick="javascript:showImage(this);" src="'||APEX_UTIL.GET_BLOB_FILE_SRC('P46_PHOTO', m.ID)||'" ALT="See full size" height="50" width="50" />' ELSE NULL END AS PHOTO FROM COM_ADVERT_TB m LEFT JOIN com_advertcategory_tb s ON m.category_id = s.category_id LEFT JOIN ( SELECT id, COUNT(id) AS REPLIES FROM Com_replyadvert_tb GROUP BY id ) r ON m.id = r.id JOIN system_username_tb e ON UPPER(m.username) = UPPER(e.username) WHERE m.created_on >= TO_DATE('01-01-2018 00:00:00', 'dd-mm-yyyy hh24:mi:ss') ORDER BY m.created_on DESC
额外检查项
- 确认页面的JavaScript中已正确定义
showImage函数,避免点击图片无响应 - 验证数据库
PHOTO列存储的是有效的BLOB格式图片数据,无损坏情况
内容的提问来源于stack exchange,提问作者Misha Rukazo
相关产品推荐
相关产品推荐

