使用交互式网格“下载Blob”

时间:2018-08-13 02:58:44

标签: blob oracle-apex

等效于交互式网格的交互式报告“下载Blob”是什么?

当前,我正在使用“交互式报表”作为解决方法,但我想使用“交互式网格”,但是没有“下载Blob”列类型,并且我不想在select子句中入侵URL。

1 个答案:

答案 0 :(得分:2)

这里有一些步骤向您展示如何在APEX 19.2中完成它。可以根据您的业务需求随意调整其他版本的APEX。

  1. 创建一个表来存储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;
    
  2. 使用此查询在表上创建一个新的Interactive Grid页面:

    select id,
      mime_type,
      name,
      dbms_lob.getlength(content) file_size
    from files
    
  3. 在应用程序中创建一个新的空白页。将页码设置为9000,并将名称设置为下载文件。

  4. 在页面设计器的左列中,右键单击内容正文(在区域下),然后选择创建区域 >。右键单击新区域,然后选择创建页面项。将新项目的名称设置为P9000_FILE_ID,并将类型设置为“隐藏”。请注意,该区域或其项目都不会显示。

  5. 在页面设计器的左列中,打开预渲染部分,右键单击标题前,然后选择创建处理。将过程的名称设置为“下载文件”,然后为 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代码是从数据库获取文件并将其流式传输到浏览器的功能。例如,您可能需要修改此代码,以确保用户应有权访问他们尝试下载的文件。另外,请考虑应用程序和页面级别的安全性。

  6. 在页面设计器中,返回到“交互式网格”页面。右键单击“交互式网格”区域下的,然后选择创建列。将列名设置为下载,将类型设置为链接,并且(在下)将类型设置为无。点击目标未定义链接按钮以打开链接设置。将 Page 设置为9000,使用弹出窗口在 Name 列下选择P9000_FILE_ID,使用弹出窗口选择 Value 列下的ID同一行),然后单击确定按钮。最后,设置链接文本(在 Target 下)以下载。

要测试,请运行页面并单击下载链接。浏览器应该下载文件,并且当您打开文件时,其内容应该是:Hello World!