powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Снова apex_util.get_blob
21 сообщений из 21, страница 1 из 1
Снова apex_util.get_blob
    #38604090
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Задача - в репорте сделать ссылку на открытие файла в новом окне.

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

С досады сделал JS кодом
Код: javascript
1.
$('td[headers=OPEN] a').attr('target','_blank');

То есть в поле типа БЛОБ подредактировал ссылку, которую апекс генерит.

Есть ли нормальный способ получения ссылок на файлы, без создания каких-то фетчей и айтемов? Хочу PL/SQL код, который мне выплюнет готовую ссылку
Код: html
1.
<a href="apex_util.get_blob?s=1338583178092&amp;a=106&amp;c=6954302679808170&amp;p=20&amp;k1=244&amp;k2=10&amp;ck=CEB51B4DD3BE81197134A8BEA096039D&amp;rt=CR">TEXT</a>
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607073
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,

Есть много способов делать ссылки,

опишите подробнее, какой используете сейчас:

- Отчет стандартный или интерактивный ?

- Какое средство сейчас используете для генерации ссылки ?
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607122
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Оба вариантов отчета.

Сейчас в маске поля указывается BLOB со всеми параметрами (таблица, поле с ИД, поле с блобом) и апекс сам в итоге генерит ссылку.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607299
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,

Как вариант, смотрите id в wwv_flow_files

потом генерируете ссылку, вида <a href="p?n=id">ссылка</a>
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607315
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Можно по подробнее. У меня файлы хранятся не в wwv_flow_files.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607417
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,

Тьфу ты, невнимательно прочитал.

Тогда

- Создается глобальная переменная, где будет ид из таблицы ( G_DOCUMENT_ID - app item, тип unresctricted )

- Делается application process, например DOWNLOAD_SERVICE, типа onDemand

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare
    p_file_name varchar2(32767);
    p_file_blob blob;
    p_file_mime varchar2(255);
begin
    select ...
      into p_file_name, p_file_blob, p_file_mime
    from ваша таблица
    where id = :G_DOCUMENT_ID;

    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="' 
           || p_file_name || '"');
    end if;
    owa_util.http_header_close;

    wpg_docload.download_file( p_file_blob );
end;



- в очтете генерируете ссылку вида:

Код: html
1.
<a href="f?p=&APP_ID.:&APP_PAGE.:&APP_SESSION.:APPLICATION_PROCESS=DOWNLOAD_SERVICE::G_DOCUMENT_ID:ИД">ссылка</a>



Готово
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607430
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Изврат конечно, но спасибо за способ.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607447
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аутентификацию можно как-нибудь так проверить:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
declare
    p_file_name varchar2(32767);
    p_file_blob blob;
    p_file_mime varchar2(255);
begin
  if APEX_AUTHENTICATION.IS_AUTHENTICATED then

    select ...
      into p_file_name, p_file_blob, p_file_mime
    from ваша таблица
    where id = :G_DOCUMENT_ID;

    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="' 
           || p_file_name || '"');
    end if;
    owa_util.http_header_close;

    wpg_docload.download_file( p_file_blob );
  else
    htp.init;
    owa_util.mime_header( 'text/html', true );
    htp.p('Пожалуйста, залогиньтесь');
  end if;
end;



GustlyИзврат конечно, но спасибо за способ.
Перепробовав кучу способов, этот кажется мне самым нормальным из всех нормальных :)

Один раз написать, зато никаких ограничений на реализацию.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607456
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Я бы хотел разврапить и выпотрошить оригинал, который JS функицю генерит.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607469
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,

Этот самый apex_util.get_blob сделан внутри аналогично, но только со всякими багами, поэтому многие юзают wpg_docload напрямую - это нормальный распространенный способ.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607497
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDev,

Мне непонятно, что за параметры оно передает, какие-то длинные ИДшники.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607509
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,

Например, с функцией apex_util.get_blob_file_src, там аналогичная ситуация (по количеству параметров), и устанавливать их напрямую - то еще удовольствие, можете почитать:

https://community.oracle.com/message/3861537#3861537

Да и параметры вполне могут поменяться от версии к версии...
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #38607551
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Менее продвинутый вариант:

Downloading Documents from the Custom Table
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Снова apex_util.get_blob
    #39499963
iv_roman_vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDevGustly,

Тьфу ты, невнимательно прочитал.

Тогда

- Создается глобальная переменная, где будет ид из таблицы ( G_DOCUMENT_ID - app item, тип unresctricted )

- Делается application process, например DOWNLOAD_SERVICE, типа onDemand

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare
    p_file_name varchar2(32767);
    p_file_blob blob;
    p_file_mime varchar2(255);
begin
    select ...
      into p_file_name, p_file_blob, p_file_mime
    from ваша таблица
    where id = :G_DOCUMENT_ID;

    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="' 
           || p_file_name || '"');
    end if;
    owa_util.http_header_close;

    wpg_docload.download_file( p_file_blob );
end;



- в очтете генерируете ссылку вида:

Код: html
1.
<a href="f?p=&APP_ID.:&APP_PAGE.:&APP_SESSION.:APPLICATION_PROCESS=DOWNLOAD_SERVICE::G_DOCUMENT_ID:ИД">ссылка</a>



Готово

почемуто ссылка сабмитит на эту же страницу.файл не загружается и ошибок нет(
В чем может быть причина?
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #39500029
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_roman_vl,

См. авторизацию на странице и внутри процесса + apex debug.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #39500136
iv_roman_vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDeviv_roman_vl,

См. авторизацию на странице и внутри процесса + apex debug.


пробую этот код прогнать прям в базе.
ругается на owa_util.mime_header

06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause: An arithmetic, numeric, string, conversion, or constraint error
occurred. For example, this error occurs if an attempt is made to
assign the value NULL to a variable declared NOT NULL, or if an
attempt is made to assign an integer larger than 99 to a variable
declared NUMBER(2).
*Action: Change the data, how it is manipulated, or how it is declared so
that values do not violate constraints.




пробовал и так и так:
owa_util.mime_header( nvl(p_file_mime,'application/octet'), false );
owa_util.mime_header( nvl(p_file_mime,'text/plain'), false );

там у меня текстовый документ .txt
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #39500142
iv_roman_vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже и на это ругается.

begin
htp.init;
owa_util.mime_header();
end;

Хотя посмотрел функцию desc sys.owa_util, параметры есть по умолчанию

MIME_HEADER CCONTENT_TYPE VARCHAR2 IN DEFAULT
BCLOSE_HEADER PL/SQL BOOLEAN IN DEFAULT
CCHARSET VARCHAR2 IN DEFAULT
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #39500205
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_roman_vl,

Не инициализирована CGI среда скорее всего.
Например, выполняйте в SQL Worshop > SQL Commands.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #39500335
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iv_roman_vl,

Вот моя тема
http://www.sql.ru/forum/1146167/upload-download-file?hl=blob
Там я окончательный пример вывел...
Вот пример сервиса картинки(рабочий)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
declare

l_rcursor sys_refcursor;
pget varchar2(32767);
mimetype varchar2(80);
p_file_name varchar2(40);
t_blob blob;
t_clob clob;
l_rcursortile sys_refcursor;
pgettitle varchar2(32767);

 l_dest_offset   integer := 1;
   l_source_offset integer := 1;
   l_lang_context  integer := DBMS_LOB.DEFAULT_LANG_CTX;
   l_warning       integer := DBMS_LOB.WARN_INCONVERTIBLE_CHAR;

begin
select goodsblob into t_blob from #OWNER#.GOODSPICTURE where goods_id=:P6_GOODS_ID;

htp.flush;
owa_util.mime_header( mimetype, false );
 htp.print( 'Content-Length: ' || dbms_lob.getlength( t_blob ) );
  htp.p( 'Content-disposition: attachment; filename='||:P6_GOODS_ID||'.png;' );
owa_util.http_header_close; 
 wpg_docload.download_file( t_blob );
 --owa_util.http_header_close;
--htp.p(t_blob);
 --   dbms_lob.freetemporary(t_blob);
  --   dbms_lob.freetemporary(t_clob);
end;



Но Важен один момент...
URL идёт на другую страницу...а в ней процесс обязательно beforeheader расположен.
а в ней тот процесс
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #39500442
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_al,

Другая страница не обязательна, можно сделать условие на :request на текущей;
+ apex_application.stop_apex_engine нужно в случае before header поставить в конец, иначе боком может вылезти (из-за того что продолжается процесс отрисовки, например, при смене версии или веб сервера)

Я не люблю before header с тех пор как в 4.1 потребовали писать htp.init (в release notes) и пришлось переписывать код. ondemand удобен тем, что хорошо подходит для размещения глобальной логики.

У ТС, я полагаю, какая-то другая pl/sql ошибка, либо делает что-то другое, нужно apex debug смотреть и проверять ссылку, чтобы была именно такой, как указана.
...
Рейтинг: 0 / 0
Снова apex_util.get_blob
    #39500452
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 5.1 onDemand так же называется Ajax Callback.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Снова apex_util.get_blob
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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