Oracle apex скачать файл blob из коллекции - PullRequest
0 голосов
/ 04 августа 2020

Пытаюсь скачать файл из коллекции. Я просмотрел множество форумов, в том числе здесь: 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;

Обратите внимание, что значения внутри закомментированного раздела (когда он включен) показывают правильное имя файла, тип mime и размер, когда я нажимаю кнопку. Это означает, что получение из коллекции работает нормально.

document details раздел рендеринга Спасибо за вашу помощь.

1 Ответ

1 голос
/ 05 августа 2020

Опубликованный вами код предназначен для нового HTTP-запроса к серверу. Если вы поместите этот код в действие Dynami c, он будет выполнен в текущем сеансе базы данных / обработанной апексной странице, и ничего не произойдет. Это ожидаемое поведение.

Один из способов решить эту проблему - создать отдельная страница для загрузки с элементом страницы PNN_SEQ. Поместите приведенный выше код в процесс предыдущей страницы заголовка на этой новой странице. В исходном сообщении о переполнении стека, на которое вы ссылаетесь, также упоминается это: Этот блок PL / SQL называется «при загрузке перед заголовком»

На кнопке загрузки на исходной странице, поместите перенаправление на url и передайте значение для P113_SEQ. Это вызовет новый запрос к серверу нужного вам типа mimetype.

Вы также можете сделать это в процессе приложения, как описано здесь: https://joelkallman.blogspot.com/2014/03/yet-another-post-how-to-link-to.html

...