Oracle Apex v21.1 如何通过卡片区域实现BLOB文件下载功能
BLOB文件卡片点击下载实现方案
前置修正说明
你现有建表语句中blob_document字段定义为VARCHAR2(512),无法存储二进制文件内容,建议先修改为BLOB类型,修改语句如下:
ALTER TABLE tb_document MODIFY blob_document BLOB;
修正后的完整建表语句参考:
CREATE TABLE tb_document ( pk_document NUMBER, nom_document VARCHAR2(4000), mimetype_document VARCHAR2(512), charset_document VARCHAR2(512), blob_document BLOB, comment_document VARCHAR2(4000), tags_document VARCHAR2(4000), creation_document TIMESTAMP(6), PRIMARY KEY(pk_document) );
下载URL配置方法
方案1:使用APEX原生工具生成链接(推荐)
直接在Cards区域的数据源SQL中新增下载链接计算列,生成的链接和原生列表报告的下载逻辑完全一致,示例SQL如下:
SELECT pk_document, nom_document, comment_document, tags_document, creation_document, -- 生成标准BLOB下载链接 APEX_UTIL.GET_BLOB_FILE_SRC( p_application_id => :APP_ID, p_blob_column_name => 'BLOB_DOCUMENT', p_pk1_value => pk_document, p_pk2_value => NULL, p_blob_table_name => 'TB_DOCUMENT', p_content_type => mimetype_document, p_filename => nom_document, p_charset => charset_document ) AS download_url FROM tb_document
方案2:自定义应用进程构造链接
如果需要自定义下载控制逻辑,可以手动构造URL,配套应用级Ajax进程实现:
- 新建应用级Ajax进程,命名为
download_blob,进程代码如下:
DECLARE v_blob BLOB; v_mime VARCHAR2(512); v_filename VARCHAR2(4000); v_charset VARCHAR2(512); BEGIN SELECT blob_document, mimetype_document, nom_document, charset_document INTO v_blob, v_mime, v_filename, v_charset FROM tb_document WHERE pk_document = APEX_UTIL.GET_NUMERIC_SESSION_STATE('P_PK_DOCUMENT'); sys.HTP.init; sys.OWA_UTIL.mime_header(v_mime, FALSE, v_charset); sys.HTP.p('Content-Length: ' || DBMS_LOB.GETLENGTH(v_blob)); sys.HTP.p('Content-Disposition: attachment; filename="' || v_filename || '"'); sys.OWA_UTIL.http_header_close; sys.WPG_DOCLOAD.download_file(v_blob); APEX_APPLICATION.STOP_APEX_ENGINE; END;
- 数据源中构造下载URL:
SELECT pk_document, nom_document, -- 手动构造下载URL 'f?p=&APP_ID.:0:&APP_SESSION.:APPLICATION_PROCESS=download_blob:::::P_PK_DOCUMENT:'||pk_document AS download_url FROM tb_document
卡片点击动作配置
- 进入Cards区域属性面板,找到「行为」→「链接」设置
- 链接类型选择「重定向到URL」,URL框填写
#DOWNLOAD_URL#(和数据源中的下载链接列名对应即可) - 若需要直接触发下载不打开新标签页,可在「HTML属性」栏输入
download - 保存页面后运行,点击卡片即可触发对应文件的下载
内容的提问来源于stack exchange,提问作者ThomasT
相关产品推荐
相关产品推荐

