Ошибка кодирования при загрузке BLOB-файла - PullRequest
0 голосов
/ 27 апреля 2020

Итак, я сейчас пытаюсь загрузить файл xml, хранящийся в таблице Oracle, со ссылкой, которую я создал для страницы 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;

Теперь в отчете страницы должно быть 2 столбца с разными ссылками на каждый из них, с размером каждого из них. Сами ссылки устанавливаются на одну и ту же страницу, используя «Type1» и «Type2» соответственно в качестве запроса, который предназначен для запуска следующей функции PL SQL для загрузки файлов:

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 как "application / xml", и файл отображается на странице в формате HTML. Любые идеи, почему "text / xml" дает ошибку кодирования? Связано ли это с 3-м значением ввода для mime_type?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

'application / xml', скорее всего, правильный mime_type. Ваш Контент-Диспозиция неверна. Вы пытаетесь загрузить файл или показать его в браузере? Если вы хотите показать его в браузере, используйте следующее:

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

Если вы хотите загрузить файл, используйте следующее:

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

Кроме того, я не конечно, когда он был добавлен, но в APEX v20.1 в Галерее приложений есть приложение «Загрузка и выгрузка образцов файлов», которое можно использовать, чтобы увидеть, как это можно сделать декларативно.

0 голосов
/ 28 апреля 2020

Несколько вещей не кажутся правильными.

  1. Откуда приходит это сообщение об ошибке "Ошибка кодирования"? Это из редактора? Это не похоже на сообщение об ошибке Oracle.
  2. Действительно ли ваш XML документ хранится в виде двоичного большого объекта? Если да, уверены ли вы, что кодировка данных действительно utf-8? Как вы это проверили?
...