我正在从收藏中下载文件。我浏览了很多论坛,包括这里: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和大小。这意味着从集合中检索工作正常。
谢谢你的帮助。
1条答案
按热度按时间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