等效于交互式网格的交互式报告“下载Blob”是什么?
当前,我正在使用“交互式报表”作为解决方法,但我想使用“交互式网格”,但是没有“下载Blob”列类型,并且我不想在select子句中入侵URL。
答案 0 :(得分:2)
这里有一些步骤向您展示如何在APEX 19.2中完成它。可以根据您的业务需求随意调整其他版本的APEX。
创建一个表来存储BLOB文件并添加一个文件作为示例。
create table files (
id number generated by default as identity,
mime_type varchar2(255),
name varchar2(255),
content blob,
constraint files_pk primary key (id)
)
/
insert into files (
mime_type,
name,
content
) values (
'text/plain',
'test.txt',
hextoraw('48656c6c6f20576f726c6421')
);
commit;
使用此查询在表上创建一个新的Interactive Grid页面:
select id,
mime_type,
name,
dbms_lob.getlength(content) file_size
from files
在应用程序中创建一个新的空白页。将页码设置为9000,并将名称设置为下载文件。
在页面设计器的左列中,右键单击内容正文(在区域下),然后选择创建区域 >。右键单击新区域,然后选择创建页面项。将新项目的名称设置为P9000_FILE_ID,并将类型设置为“隐藏”。请注意,该区域或其项目都不会显示。
在页面设计器的左列中,打开预渲染部分,右键单击标题前,然后选择创建处理。将过程的名称设置为“下载文件”,然后为 PL / SQL代码输入以下代码:
declare
l_files_rec files%rowtype;
begin
select *
into l_files_rec
from files
where id = :P9000_FILE_ID;
owa_util.mime_header(l_files_rec.mime_type, false);
htp.p('Content-Length: ' || dbms_lob.getlength(l_files_rec.content));
htp.p('Content-Disposition: attachment; filename="' || l_files_rec.name || '"');
owa_util.http_header_close;
wpg_docload.download_file(l_files_rec.content);
apex_application.stop_apex_engine;
end;
此PL / SQL代码是从数据库获取文件并将其流式传输到浏览器的功能。例如,您可能需要修改此代码,以确保用户应有权访问他们尝试下载的文件。另外,请考虑应用程序和页面级别的安全性。
在页面设计器中,返回到“交互式网格”页面。右键单击“交互式网格”区域下的列,然后选择创建列。将列名设置为下载,将类型设置为链接,并且(在源下)将类型设置为无。点击目标的未定义链接按钮以打开链接设置。将 Page 设置为9000,使用弹出窗口在 Name 列下选择P9000_FILE_ID,使用弹出窗口选择 Value 列下的ID同一行),然后单击确定按钮。最后,设置链接文本(在 Target 下)以下载。
要测试,请运行页面并单击下载链接。浏览器应该下载文件,并且当您打开文件时,其内容应该是:Hello World!