Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle APEX Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
Привет!
Ранее пользовался простой и испытанной конструкцией для формирования файла и записи его на диск или обработки соотв. приложением:
В Before Header прописывал Process, формирующий двоичный контекст файла и отправлющий его ОС с помощью WPG_DOCLOAD.DOWNLOAD_FILE

Но это работало на типовой странице.
В модельном диалоге это не работает. Точнее - не отображается контент самого окна после формирования файла.

Подскажите, плз, модный сейчас путь генерации файлов.
Спасибо!
28 июн 17, 14:11    [20596737]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Никанор Кузьмич
Member

Откуда: Москва
Сообщений: 240
У нас работает так:
1. По клику на кнопке идет сабмит
2. Запускается процесс, который готовит файл и ссылку для его скачивания (пакет для этого делал другой человек, я внутрь не заглядывал пока).
3. Потом идет бранч по урлу, созданному на предыдущем шаге
Но это все работает в обычном окне, не в модальном. В принципе, в модальном тоже должно.

Курдль
В модельном диалоге это не работает. Точнее - не отображается контент самого окна после формирования файла.
Не знаю как в апексе 5.х, а в версиях 4.х контент окна тоже не отображался, даже если оно не модальное (а модальных тогда и не было).
28 июн 17, 14:53    [20596915]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
Никанор Кузьмич
У нас работает так:
2. Запускается процесс, который готовит файл и ссылку для его скачивания (пакет для этого делал другой человек, я внутрь не заглядывал пока).

Файл на сервере что ли готовится?
Кто ж мне даст файлы на сервере формировать?..
28 июн 17, 16:30    [20597385]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Migelle
Member

Откуда:
Сообщений: 160
Курдль,

Делал таким способом.
Для подготовки файла делается специальная страница, которая только выгружает файл.
На модальном окне делается кнопка с Action Javascript

window.location.href="f?p=&APP_ID.:<<PAGE>>:&SESSION.";

Файл выгружается, окно модальное остается, при необходимости можно закрыть отдельно.
28 июн 17, 16:47    [20597447]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль,

В версии 4.1 были изменения, касающиеся размещения подобного кода в before header.
Логично поместить код WPG_DOCLOAD в page processing или ondemand, тогда не будет проблем с отрисовкой.
28 июн 17, 18:28    [20597794]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev
Курдль,

В версии 4.1 были изменения, касающиеся размещения подобного кода в before header.
Логично поместить код WPG_DOCLOAD в page processing или ondemand, тогда не будет проблем с отрисовкой.

Не могу добиться вывода потока из AJAX. Процедура отрабатывает, но браузер ничего не предпринимает.
Все советы на форумах сводятся к выделению отдельной страницы, которая будет отвечать за download, а сама оставаться невидимой, благодаря
apex_application.stop_apex_engine;

Но как специально обученной странице передать BLOB для download?
APEX_APPLICATION_TEMP_FILES - доступна только на чтение. Заводить для этого таблицу, даже временную - криво...
29 июл 17, 18:07    [20684888]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль,

Вы пишите выгрузку файла так ? Зачем вам APEX_APPLICATION_TEMP_FILES не понял.
Если вы отдаете файл через WPG_DOCLOAD.DOWNLOAD_FILE, какая разница в какой таблице он лежит или не лежит, у вас есть сгенерированный blob, который вы отдаете.

1. Изолируете код:

htp.init:
...
WPG_DOCLOAD.DOWNLOAD_FILE
...
apex_application.stop_apex_engine;

Код выгрузки можно поместить много куда, см. выше.

2. У браузеров есть проблемы с загрузкой файлов через аякс. Используйте не аяксный POST или GET, можно через js, в том числе методом GET, например, просто нажав на ссылку определенного формата, можно вызвать ondemand процесс.

3. Если выбрали метод POST в 5.1 отключите Reload on Submit: Only For Success, если включен, чтобы избежать аякс вызова на submit.
29 июл 17, 20:36    [20685029]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev
Курдль,

Зачем вам APEX_APPLICATION_TEMP_FILES не понял.
...у вас есть сгенерированный blob, который вы отдаете.

Во всех примерах, что я нашел, BLOB сохранялся в какой-то пользовательской таблице на одной форме, а извлекался и выгружался в файл - на другой.
А что, можно просто передать его параметром вызова, в страничный ITEM?
29 июл 17, 23:43    [20685263]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль
Во всех примерах, что я нашел, BLOB сохранялся в какой-то пользовательской таблице на одной форме, а извлекался и выгружался в файл - на другой.

Не обязательно. С wpg_docload простого blob достаточно.
Курдль
А что, можно просто передать его параметром вызова, в страничный ITEM?

Если нужно просто вывести содержимое на страницу - см htp.prn + region type: pl/sql dynamic content
30 июл 17, 00:35    [20685305]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev,

Я имею поразительный дар - объяснять так, чтобы меня никто не понял :D
Поясню выбранное мной решение из имеющихся в интернете примеров.
1. Page1 (modal dialog) формирует BLOB для последующего скачивания на комп.
2. Page1 вызывает Page2 (универсальный скачиватель для всего приложения) и передает в неё BLOB, MIME_TYPE и FILE_NAME.
3. Page2 отдает сформированный из BLOB поток (файл) в браузер, при этом не отображаясь.
Это, мне кажется, изящное решение, позволяющее осуществлять функцию скачивания одной странице. Другие страницы при необходимости отдать что-то на скачивание, обращаются к ней.
Сейчас не приходит в голову решение, как лучше оформить вызов этой страницы.
31 июл 17, 10:11    [20686976]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль,

Смысла в Page2 не вижу. Вместо Page2, лучше использовать, например: либо onDemand, либо onSubmit Application Process.

Далее, мне непонятно, чем конкретно вызвано разделение формирования и выгрузки файлов на 2 запроса, с учетом, если я правильно понял, сформированные файлы не хранятся сейчас в таблице ?

В типовых ситуациях, файлы либо хранятся в таблицах, либо blob формируется в том же запросе, что и выгрузка файла.
Еще есть вариант выгрузки файла браузером средствами html5, но такое пока что современными браузерами поддерживается плохо.

Касательно AJAX, XMLHttpRequest не выведет диалога с сохранением файла, потому что для него предусмотрен другой способ обработки ответа сервера.
31 июл 17, 13:11    [20687674]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev
Курдль,

Смысла в Page2 не вижу. Вместо Page2, лучше использовать, например: либо onDemand, либо onSubmit Application Process.

Далее, мне непонятно, чем конкретно вызвано разделение формирования и выгрузки файлов на 2 запроса, с учетом, если я правильно понял, сформированные файлы не хранятся сейчас в таблице ?

В типовых ситуациях, файлы либо хранятся в таблицах, либо blob формируется в том же запросе, что и выгрузка файла.
Еще есть вариант выгрузки файла браузером средствами html5, но такое пока что современными браузерами поддерживается плохо.

Касательно AJAX, XMLHttpRequest не выведет диалога с сохранением файла, потому что для него предусмотрен другой способ обработки ответа сервера.

1. Смысл в Page2 такой: Page1 типа "модальный диалог" я не могу заставить работать по ранее понятным мне правилам.
Код, взятый из примера, по-разному отрабатывает в стандартной и модальной странице (модальная открывается, несмотря ни на что и висит без всякого контента поверх вызывающей).
+
declare
    l_file_blob blob;
    l_file_name eba_demo_files.filename%type;
    l_file_mimetype eba_demo_files.file_mimetype%type;
begin
    select file_blob , file_mimetype , filename into l_file_blob , l_file_mimetype , l_file_name from eba_demo_files where id = :p1000_file_id;
    
    owa_util.mime_header( l_file_mimetype , false );
    htp.p('Content-Disposition: attachment; filename="' || l_file_name ||'"');
    htp.p('Content-length: ' || dbms_lob.getlength( l_file_blob ));
    owa_util.http_header_close;
    wpg_docload.download_file( l_file_blob );
    -- Stop page processing
    apex_application.stop_apex_engine ;
end;


2. Поправьте, если я путаю, но в АРЕХ 5 нет OnDemand процессов. Теперь все они AJAX Callback.
After Submit процессы не влекут за собой рендеринг на браузере, поэтому приведенный выше код не может ничего выводить.
Если Вы знаете, как из такого вывести файловый поток - сообщите, пожалуйста, а то я даже в интернете ничего не нашел по этой теме.
31 июл 17, 13:37    [20687804]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль
2. Поправьте, если я путаю, но в АРЕХ 5 нет OnDemand процессов. Теперь все они AJAX Callback.

on-demand / Ajax callback одно и то же. в api guide так и пишут:

This function calls a PL/SQL on-demand (Ajax callback) process.

About Running an On Demand Process from a Page Request

Курдль
Если Вы знаете, как из такого вывести файловый поток - сообщите, пожалуйста, а то я даже в интернете ничего не нашел по этой теме.


см. 20685029 п.1

Еще есть вариант через public functions, но их настраивать сложнее.
31 июл 17, 14:10    [20688071]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Пример:

    htp.init;
    owa_util.mime_header( p_file_mime, false );
    htp.p ('content-length: ' || DBMS_LOB.getlength( lob_loc => p_file_blob ) );

    if INSTR(UPPER(OWA_UTIL.GET_CGI_ENV('HTTP_USER_AGENT')), 'MSIE') > 0 then

      htp.p('Content-Disposition:  attachment; filename="' || UTL_URL.ESCAPE( p_file_name, FALSE, 'UTF-8' ) || '"');
    else
      htp.p('Content-Disposition:  attachment; filename*=UTF-8'''''||UTL_URL.ESCAPE( p_file_name, FALSE, 'UTF-8' ));
    end if;
    owa_util.http_header_close;

    wpg_docload.download_file( p_file_blob );
    apex_application.stop_apex_engine;
31 июл 17, 14:49    [20688351]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev,

Да, Вы в самом начале дали мне правильную подсказку.
Но дальше, к сожалению, у меня ума не хватает ею воспользоваться.
Ваши советы слишком умны для меня :(
Мне следует отказаться от WPG_DOCLOAD.DOWNLOAD_FILE?
Тогда как?
31 июл 17, 16:37    [20688967]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль,

Вы спрашивали общих советов, но так и не описали свою задачу, что вы хотите сделать.
Вывести модальное окно и окно скачивания файла одновременно ?
Я не могу представить, зачем такое может быть нужно, я бы поменял подход, потому что выглядит плохо.

Или же вы что-то другое хотите сделать ? Если то, то есть несколько способов, например в модальном окне сделайте DA onload, в нём action: execute javascript code, вызовите apex.navigation.redirect (вам выше подсказывали window.location.href если работаете со старыми версиями) или apex.submit (если работаете с версией 5.1 см. так же reloadOnSubmit параметр) и будет вам скачивание файла хоть через before header процесс, хоть через on submit процесс, хоть через on demand (Ajax callback) процесс.

Пример кода я привел. Формат ссылки вызова on demand тоже, выше есть ссылка на документацию c on demand.
31 июл 17, 17:14    [20689087]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev,

Задача.
1. Необходимо создать одну страницу типа модальный диалог "Детальные данные документа"
2. Обеспечить функцию генерации документа из БД и выгрузке его на ПК при нажатии кнопки "Download" на вышеуказанной странице.
31 июл 17, 17:25    [20689132]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль,

Я чаще всего в таких случаях в кнопке download формирую простую ссылку, которая вызывает On Demand Process
(формат описан в About Running an On Demand Process from a Page Request)

В этой ссылке можно передать так же application items: тип источника данных, ид источника данных, по которым можно сформировать или выбрать файл. Если данные вводятся на форме, можно ссылку сформировать динамически в DA. Можно просто выполнить apex.submit вместо этого, как уже написано, способов много.
31 июл 17, 17:34    [20689167]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev
Курдль,

Я чаще всего в таких случаях в кнопке download формирую простую ссылку, которая вызывает On Demand Process
(формат описан в About Running an On Demand Process from a Page Request)

Я худо-бедно умею вызывать AJAX процессы, но не умею формировать из них поток для загрузки файлов.
Как следует формировать и передавать поток из AJAX процесса?
С помощью WPG_DOCLOAD.DOWNLOAD_FILE?
Или HTP.p?
Или Htp.Prn?
SvDev
как уже написано, способов много.

Мне бы хватило и одного, но подробно описанного :(
31 июл 17, 21:19    [20689619]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль
но не умею формировать из них поток для загрузки файлов.
Как следует формировать и передавать поток из AJAX процесса?
С помощью WPG_DOCLOAD.DOWNLOAD_FILE?
Или HTP.p?
Или Htp.Prn?
SvDev
как уже написано, способов много.

Мне бы хватило и одного, но подробно описанного :(

Вы имеете ввиду, как отдать файл через Ajax callback процесс ?

С WPG_DOCLOAD, пример кода уже приведен, apex_application.stop_apex_engine; разве что в данном случае, пожалуй, лишний.
htp.p не подойдёт, врят ли вам нужны лишние символы перевода строки.
htp.prn можно, если данные текстовые (результат будет принудительно сконвертирован в UTF-8 для не UTF-8 базы), и если это удобно.
31 июл 17, 21:34    [20689645]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль
Я худо-бедно умею вызывать AJAX процессы, но не умею формировать из них поток для загрузки файлов.

Вы может и умеете, но как я уже писал, вы не можете просто так вызвать диалог скачивания файла сделав AJAX запрос (т.е. асинхронно, используя htmldb_get, apex.server.process или др. подобные функции )
А вот не AJAX методами: apex.navigation.redirect или просто кликнув мышкой по простой ссылке (что я и предлагаю) можете.
31 июл 17, 21:53    [20689674]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Migelle
Member

Откуда:
Сообщений: 160
Курдль
APEX_APPLICATION_TEMP_FILES - доступна только на чтение. Заводить для этого таблицу, даже временную - криво...


А в чем кривость? Типа, использовать созданную апексом нормально, а свою точно такую же криво?
Я пытался решить такую же проблему, и в итоге создал себе таблицу подобную апексовой и таскаю блобы/клобы между страницами в ней.
31 июл 17, 22:31    [20689721]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev,
У меня не получается с таким вызовом:
function f_CallOndemand(p_ID)
{
        var get = new htmldb_Get(null,&APP_ID., 'APPLICATION_PROCESS=TEST_ONDEMAND',&APP_PAGE_ID.);
		get.addParam('x01', p_ID);
//        var gReturn = get.get();
//        alert(gReturn);
        get.get();
 };

Когда я снимаю комментарий с присвоения и алерта - в его поле выводится корректное содержание файла, сформированного на стороне сервера.
А в противном случае - ничего не происходит.
31 июл 17, 22:33    [20689723]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
SvDev
Member

Откуда: Челябинск
Сообщений: 1953
Курдль,

Дык, а я что твержу уже сколько времени, про htmldb_Get уже даже явно написал ?
Ваш код неявно использует XMLHttpRequest, и не будет он выводить диалог, потому что работает он другим образом, выводит результат в обработчик.

Пишите ссылку <a href="f?p=...">, так же как пишите обычные ссылки (см. About Running an On Demand Process from a Page Request) и тогда будет вызван on demand (Ajax callback) процесс с предложением скачать...
31 июл 17, 22:46    [20689738]     Ответить | Цитировать Сообщить модератору
 Re: Формирование файла из модального окна (APEX5)  [new]
Курдль
Member

Откуда: Мск
Сообщений: 1062
SvDev
Курдль,

Дык, а я что твержу уже сколько времени, про htmldb_Get уже даже явно написал ?
Ваш код неявно использует XMLHttpRequest, и не будет он выводить диалог, потому что работает он другим образом, выводит результат в обработчик.

Пишите ссылку <a href="f?p=...">, так же как пишите обычные ссылки (см. About Running an On Demand Process from a Page Request) и тогда будет вызван on demand (Ajax callback) процесс с предложением скачать...

Каюсь, просмотрел это важное примечание.
Однако при генерации URL-а натыкаюсь опять же на неприятные особенности модального диалога.
Сейчас попытаюсь синтезировать URL при помощи apex_util.prepare_url
К тому же промелькнули обсуждения какого-то бага в 5.0 при таком вызове модального диалога.
А потом буду придумывать, как запихать в URL параметры.
Migelle
Курдль
APEX_APPLICATION_TEMP_FILES - доступна только на чтение. Заводить для этого таблицу, даже временную - криво...


А в чем кривость? Типа, использовать созданную апексом нормально, а свою точно такую же криво?
Я пытался решить такую же проблему, и в итоге создал себе таблицу подобную апексовой и таскаю блобы/клобы между страницами в ней.

Структурой БД я не могу распоряжаться по своему усмотрению. Подумываю над временной, но плохо представляю себе, как сессия АРЕХ соотносится с сессией оракла.
31 июл 17, 23:23    [20689778]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle APEX Ответить