Oracle apex 从 collection 下载 blob 文件

Oracle apex download blob file from collection

我正在尝试从 collection 下载文件。 我浏览了很多论坛,包括这里: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 和大小。这意味着来自 collection 的检索工作正常。

感谢您的帮助。

您 posted 的代码用于向服务器发出新的 http 请求。如果将该代码放在动态操作中,它将在当前数据库 session/rendered 顶点页面中执行,并且没有任何 happens.That 是预期的行为。

解决此问题的一种方法是使用页面项 PNN_SEQ 创建单独的下载页面。将上面的代码放在这个新页面上的 header 页面处理之前。您提到的原始堆栈溢出 post 也提到了这一点:这个 PL/SQL 块称为 'on load before header'

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

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