所以,我现在正试图下载一个存储在Oracle表中的xml文件,这个文件是我为Oracle Apex页面创建的链接。下面是我的设置。
这个表可以包含2个不同的xml文件,以blob的形式存储。我试图在Oracle Apex上创建一个报告,并提供下载这些blob的链接,每行数据的每一种类型的文件都有一个链接。
我需要设置链接的查询如下。
select max(case when a.filename like 'TYPE1%' then dbms_lob.getlength(a.upload_file) else null end) as upload_type1,
max(case when a.filename like 'TYPE2%' then dbms_lob.getlength(a.upload_file) else null end) as upload_type2
from blob_table a;
现在页面报告应该有两列,每列都有不同的链接,设置成每列的大小。链接本身的设置是在同一个页面分别用 "Type1 "和 "Type2 "作为请求,其目的是触发下面的PLSQL函数下载文件。
declare
l_blob_content blob_table.upload_file%TYPE;
l_mime_type varchar2(20);
l_id number;
l_filename varchar2(255);
begin
select id
into l_id
from blob_table
where file_id = :FILE_ID
and filename like 'TYPE1%';
select upload_file
,'text/xml',
filename
into l_blob_content,
l_mime_type,
l_filename
from blob_table
where id = l_id;
sys.HTP.init;
sys.OWA_UTIL.mime_header(l_mime_type, FALSE, 'UTF-8');
sys.HTP.p('Content-Length: ' || DBMS_LOB.getlength(l_blob_content));
sys.HTP.p('Content-Disposition: filename="' || l_filename || '"');
sys.OWA_UTIL.http_header_close;
sys.WPG_DOCLOAD.download_file(l_blob_content);
apex_application.stop_apex_engine;
exception when apex_application.e_stop_apex_engine then
null;
when others then
HTP.p('Something wrong');
end;
到目前为止,我在搜索这个功能时看到的东西,似乎都是正确的。然而当我点击链接并尝试下载时,得到的信息是这样的。
一开始我还以为出了什么问题,也测试了一下mime_type为 "applicationxml",结果文件在页面中显示为HTML格式。请问为什么 "textxml "会出现编码错误?是否与mime_type的第3个输入值有关?
'applicationxml'可能是正确的mime_type。你的Content-Disposition是错误的。你是想下载文件还是想在浏览器中显示?如果你想在浏览器中显示它,那么使用以下方法。
sys.HTP.p('Content-Disposition: inline');
如果你想下载文件,就用下面的方法。
sys.HTP.p('Content-Disposition: attachment; filename="' || l_filename || '"');
另外,我不知道它是什么时候添加的,但是在APEX v20.1中,在应用库中有一个样本文件上传和下载的应用,你可以用它来看看如何用声明的方式来完成。
有几件事似乎不对。