Oracle apex 从集合中下载 blob 文件

Posted

技术标签:

【中文标题】Oracle apex 从集合中下载 blob 文件【英文标题】:Oracle apex download blob file from collection 【发布时间】:2020-08-04 16:37:27 【问题描述】:

我正在尝试从集合中下载文件。 我浏览了很多论坛,包括这里:APEX: Download BLOB from temporary table

但它不起作用,我不知道为什么。不会引发错误。 按下按钮时我的 PL/SQL 代码是:

DECLARE
  v_mime      VARCHAR2(255);
  v_length    NUMBER;
  v_file_name VARCHAR2(255);
  Lob_loc     BLOB;
BEGIN   
  SELECT c001, c004, blob001
  INTO   v_file_name, v_mime, Lob_loc
  FROM   apex_collections
  WHERE  collection_name = 'COLLECTION_DOCS' AND seq_id = :P113_SEQ;
  
  select sys.dbms_lob.getlength(Lob_loc) into v_length from dual;

  /* This raise shows me the correct values taken form the collection table
  raise_application_error (-20001,'
                           name:' || v_file_name || '
                           mime: ' || v_mime || '
                           length: ' || v_length || '
                           ');
  */
  
  sys.htp.init;
  sys.owa_util.mime_header(v_mime, FALSE);
  sys.htp.p('Content-length: ' || v_length);
  sys.htp.p('Content-Disposition:  attachment; filename="' || v_file_name || '"' );
  sys.owa_util.http_header_close;
  sys.wpg_docload.download_file( Lob_loc );
  apex_application.stop_apex_engine;

END;

请注意,当我按下按钮时,注释部分中的值(启用时)会显示正确的文件名、mimetype 和大小。这意味着从集合中检索工作正常。

感谢您的帮助。

【问题讨论】:

我会在内容处置调用之后尝试使用sys.htp.p('Cache-Control: max-age=3600'); 仍然没有下载:( 你把这段代码放在哪里了? @KoenLostrie 我添加了下载按钮的图片,以及激活 PL/SQL 代码的动态操作。它都在“模式对话框”页面中,接收集合的“seq id” 【参考方案1】:

您发布的代码是针对服务器的新 http 请求。如果您将该代码放入动态操作中,它将在当前数据库会话/呈现的顶点页面中执行,并且没有任何反应。这是预期的行为。

解决此问题的一种方法是使用页面项 PNN_SEQ 创建一个单独的下载页面。将上面的代码放在这个新页面的前页眉进程中。您所指的原始堆栈溢出帖子也提到了这一点:这个 PL/SQL 块被称为“在标题之前加载”

在原始页面的下载按钮上,将重定向到 url 并传递 P113_SEQ 的值。这将向您需要的 mimetype 的服务器发出一个新请求。

您也可以在此处描述的申请流程中执行此操作:https://joelkallman.blogspot.com/2014/03/yet-another-post-how-to-link-to.html

【讨论】:

非常感谢它有效! (我使用了单独的页面)。只有一件事,您写了“将重定向到 url”,我猜您的意思是“重定向到此应用程序中的页面” 只是一个更新:在过去的一个月里,发生了一些变化,可能与浏览器更新或什么有关……但现在下载窗口不会关闭,它只是在思考和思考(下载仍在发生)。所以我不得不改变这个方法 - >我将文件从集合中复制到顶点 BLOB 项目中,然后通过模拟下载点击从那里下载。如果有人修复了早期的错误,我会很高兴听到

以上是关于Oracle apex 从集合中下载 blob 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用卡片区域下载 BLOB 文件 - Oracle Apex v21.1

Oracle ApEx Shuttle 和 Ajax On Demand 流程

在 oracle apex 中通过电子邮件发送富文本字段

从基于 PL/SQL 函数体返回 SQL 查询的 Oracle APEX 5 经典报告下载到 Excel 选项,

由于日期格式,从 Apex 表单调用 Oracle SP 失败

如何在 Oracle Apex 中过滤给定单词的穿梭列表?