从集合下载blob文件

ecfdbz9o  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(300)

我正在从收藏中下载文件。我浏览了很多论坛,包括这里:apex:从临时表下载blob
但它不起作用,我不明白为什么。未引发错误。按下按钮时,我的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和大小。这意味着从集合中检索工作正常。


谢谢你的帮助。

w6lpcovy

w6lpcovy1#

您发布的代码用于向服务器发送新的http请求。如果将该代码放入动态操作中,它将在当前数据库会话/呈现的apex页中执行,并且不会发生任何事情。这是预期的行为。
解决这个问题的一种方法是使用页面项pnn\ seq创建一个单独的页面供下载。将上面的代码放在这个新页面的before头页进程中。您提到的原始堆栈溢出帖子也提到了这一点:这个pl/sql块被称为“在头之前加载”
在原始页面的下载按钮上,重定向到url并传递p113\ seq的值。这将向您需要的mimetype服务器发出一个新请求。
您也可以在应用程序过程中执行此操作,如下所述:https://joelkallman.blogspot.com/2014/03/yet-another-post-how-to-link-to.html

相关问题