下载BLOB文件时出现编码错误。

问题描述 投票:0回答:2

所以,我现在正试图下载一个存储在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;

到目前为止,我在搜索这个功能时看到的东西,似乎都是正确的。然而当我点击链接并尝试下载时,得到的信息是这样的。

enter image description here

一开始我还以为出了什么问题,也测试了一下mime_type为 "applicationxml",结果文件在页面中显示为HTML格式。请问为什么 "textxml "会出现编码错误?是否与mime_type的第3个输入值有关?

xml encoding blob oracle-apex
2个回答
2
投票

'applicationxml'可能是正确的mime_type。你的Content-Disposition是错误的。你是想下载文件还是想在浏览器中显示?如果你想在浏览器中显示它,那么使用以下方法。

sys.HTP.p('Content-Disposition: inline');

如果你想下载文件,就用下面的方法。

sys.HTP.p('Content-Disposition: attachment; filename="' || l_filename || '"');

另外,我不知道它是什么时候添加的,但是在APEX v20.1中,在应用库中有一个样本文件上传和下载的应用,你可以用它来看看如何用声明的方式来完成。


0
投票

有几件事似乎不对。

  1. 那个 "编码错误 "的错误信息是从哪里来的? 是来自编辑器吗? 它看起来不像是Oracle的错误信息。
  2. 你的XML文档真的是以二进制LOB的形式存储的吗? 如果是的话,你是否确定数据编码真的是utf-8? 你是如何验证的?
© www.soinside.com 2019 - 2024. All rights reserved.