powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Формирование файла из модального окна (APEX5)
25 сообщений из 36, страница 1 из 2
Формирование файла из модального окна (APEX5)
    #39479054
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Ранее пользовался простой и испытанной конструкцией для формирования файла и записи его на диск или обработки соотв. приложением:
В Before Header прописывал Process, формирующий двоичный контекст файла и отправлющий его ОС с помощью WPG_DOCLOAD.DOWNLOAD_FILE

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

Подскажите, плз, модный сейчас путь генерации файлов.
Спасибо!
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39479095
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас работает так:
1. По клику на кнопке идет сабмит
2. Запускается процесс, который готовит файл и ссылку для его скачивания (пакет для этого делал другой человек, я внутрь не заглядывал пока).
3. Потом идет бранч по урлу, созданному на предыдущем шаге
Но это все работает в обычном окне, не в модальном. В принципе, в модальном тоже должно.

КурдльВ модельном диалоге это не работает. Точнее - не отображается контент самого окна после формирования файла.Не знаю как в апексе 5.х, а в версиях 4.х контент окна тоже не отображался, даже если оно не модальное (а модальных тогда и не было).
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39479192
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никанор КузьмичУ нас работает так:
2. Запускается процесс, который готовит файл и ссылку для его скачивания (пакет для этого делал другой человек, я внутрь не заглядывал пока).

Файл на сервере что ли готовится?
Кто ж мне даст файлы на сервере формировать?..
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39479204
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курдль,

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

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

Файл выгружается, окно модальное остается, при необходимости можно закрыть отдельно.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39479269
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

В версии 4.1 были изменения, касающиеся размещения подобного кода в before header.
Логично поместить код WPG_DOCLOAD в page processing или ondemand, тогда не будет проблем с отрисовкой.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497027
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevКурдль,

В версии 4.1 были изменения, касающиеся размещения подобного кода в before header.
Логично поместить код WPG_DOCLOAD в page processing или ondemand, тогда не будет проблем с отрисовкой.
Не могу добиться вывода потока из AJAX. Процедура отрабатывает, но браузер ничего не предпринимает.
Все советы на форумах сводятся к выделению отдельной страницы, которая будет отвечать за download, а сама оставаться невидимой, благодаря
Код: plsql
1.
apex_application.stop_apex_engine;


Но как специально обученной странице передать BLOB для download?
APEX_APPLICATION_TEMP_FILES - доступна только на чтение. Заводить для этого таблицу, даже временную - криво...
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497050
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

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

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

Код: plsql
1.
2.
3.
4.
5.
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.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497101
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevКурдль,

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

Во всех примерах, что я нашел, BLOB сохранялся в какой-то пользовательской таблице на одной форме, а извлекался и выгружался в файл - на другой.
А что, можно просто передать его параметром вызова, в страничный ITEM?
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497114
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльВо всех примерах, что я нашел, BLOB сохранялся в какой-то пользовательской таблице на одной форме, а извлекался и выгружался в файл - на другой.

Не обязательно. С wpg_docload простого blob достаточно.
КурдльА что, можно просто передать его параметром вызова, в страничный ITEM?
Если нужно просто вывести содержимое на страницу - см htp.prn + region type: pl/sql dynamic content
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497572
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Я имею поразительный дар - объяснять так, чтобы меня никто не понял :D
Поясню выбранное мной решение из имеющихся в интернете примеров.
1. Page1 (modal dialog) формирует BLOB для последующего скачивания на комп.
2. Page1 вызывает Page2 (универсальный скачиватель для всего приложения) и передает в неё BLOB, MIME_TYPE и FILE_NAME.
3. Page2 отдает сформированный из BLOB поток (файл) в браузер, при этом не отображаясь.
Это, мне кажется, изящное решение, позволяющее осуществлять функцию скачивания одной странице. Другие страницы при необходимости отдать что-то на скачивание, обращаются к ней.
Сейчас не приходит в голову решение, как лучше оформить вызов этой страницы.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497727
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

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

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

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

Касательно AJAX, XMLHttpRequest не выведет диалога с сохранением файла, потому что для него предусмотрен другой способ обработки ответа сервера.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497750
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevКурдль,

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

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

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

Касательно AJAX, XMLHttpRequest не выведет диалога с сохранением файла, потому что для него предусмотрен другой способ обработки ответа сервера.
1. Смысл в Page2 такой: Page1 типа "модальный диалог" я не могу заставить работать по ранее понятным мне правилам.
Код, взятый из примера, по-разному отрабатывает в стандартной и модальной странице (модальная открывается, несмотря ни на что и висит без всякого контента поверх вызывающей).
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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 процессы не влекут за собой рендеринг на браузере, поэтому приведенный выше код не может ничего выводить.
Если Вы знаете, как из такого вывести файловый поток - сообщите, пожалуйста, а то я даже в интернете ничего не нашел по этой теме.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497784
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль2. Поправьте, если я путаю, но в АРЕХ 5 нет OnDemand процессов. Теперь все они AJAX Callback.

on-demand / Ajax callback одно и то же. в api guide так и пишут:
Код: plaintext
1.
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, но их настраивать сложнее.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497802
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    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;
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497887
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Да, Вы в самом начале дали мне правильную подсказку.
Но дальше, к сожалению, у меня ума не хватает ею воспользоваться.
Ваши советы слишком умны для меня :(
Мне следует отказаться от WPG_DOCLOAD.DOWNLOAD_FILE?
Тогда как?
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497912
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

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

Или же вы что-то другое хотите сделать ? Если то, то есть несколько способов, например в модальном окне сделайте 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.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497922
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Задача.
1. Необходимо создать одну страницу типа модальный диалог "Детальные данные документа"
2. Обеспечить функцию генерации документа из БД и выгрузке его на ПК при нажатии кнопки "Download" на вышеуказанной странице.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497925
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

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

В этой ссылке можно передать так же application items: тип источника данных, ид источника данных, по которым можно сформировать или выбрать файл. Если данные вводятся на форме, можно ссылку сформировать динамически в DA. Можно просто выполнить apex.submit вместо этого, как уже написано, способов много.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39497996
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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как уже написано, способов много.
Мне бы хватило и одного, но подробно описанного :(
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39498004
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдльно не умею формировать из них поток для загрузки файлов.
Как следует формировать и передавать поток из 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 базы), и если это удобно.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39498010
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльЯ худо-бедно умею вызывать AJAX процессы, но не умею формировать из них поток для загрузки файлов.
Вы может и умеете, но как я уже писал, вы не можете просто так вызвать диалог скачивания файла сделав AJAX запрос (т.е. асинхронно, используя htmldb_get, apex.server.process или др. подобные функции )
А вот не AJAX методами: apex.navigation.redirect или просто кликнув мышкой по простой ссылке (что я и предлагаю) можете.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39498020
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КурдльAPEX_APPLICATION_TEMP_FILES - доступна только на чтение. Заводить для этого таблицу, даже временную - криво...

А в чем кривость? Типа, использовать созданную апексом нормально, а свою точно такую же криво?
Я пытался решить такую же проблему, и в итоге создал себе таблицу подобную апексовой и таскаю блобы/клобы между страницами в ней.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39498021
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,
У меня не получается с таким вызовом:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
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();
 };


Когда я снимаю комментарий с присвоения и алерта - в его поле выводится корректное содержание файла, сформированного на стороне сервера.
А в противном случае - ничего не происходит.
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39498027
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль,

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

Пишите ссылку <a href="f?p=...">, так же как пишите обычные ссылки (см. About Running an On Demand Process from a Page Request) и тогда будет вызван on demand (Ajax callback) процесс с предложением скачать...
...
Рейтинг: 0 / 0
Формирование файла из модального окна (APEX5)
    #39498040
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - доступна только на чтение. Заводить для этого таблицу, даже временную - криво...

А в чем кривость? Типа, использовать созданную апексом нормально, а свою точно такую же криво?
Я пытался решить такую же проблему, и в итоге создал себе таблицу подобную апексовой и таскаю блобы/клобы между страницами в ней.
Структурой БД я не могу распоряжаться по своему усмотрению. Подумываю над временной, но плохо представляю себе, как сессия АРЕХ соотносится с сессией оракла.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Формирование файла из модального окна (APEX5)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]