Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Снова apex_util.get_blob / 21 сообщений из 21, страница 1 из 1
03.04.2014, 12:27
    #38604090
Gustly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
Добрый день.

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

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

С досады сделал 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
07.04.2014, 12:06
    #38607073
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
Gustly,

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

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

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

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

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

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

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

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

Можно по подробнее. У меня файлы хранятся не в wwv_flow_files.
...
Рейтинг: 0 / 0
07.04.2014, 16:02
    #38607417
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
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
07.04.2014, 16:08
    #38607430
Gustly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
SvDev,

Изврат конечно, но спасибо за способ.
...
Рейтинг: 0 / 0
07.04.2014, 16:16
    #38607447
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_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.
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
07.04.2014, 16:20
    #38607456
Gustly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
SvDev,

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

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

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

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

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

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

Downloading Documents from the Custom Table
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
03.08.2017, 22:05
    #39499963
iv_roman_vl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
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
04.08.2017, 00:43
    #39500029
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
iv_roman_vl,

См. авторизацию на странице и внутри процесса + apex debug.
...
Рейтинг: 0 / 0
04.08.2017, 10:32
    #39500136
iv_roman_vl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
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
04.08.2017, 10:37
    #39500142
iv_roman_vl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
Даже и на это ругается.

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
04.08.2017, 11:47
    #39500205
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
iv_roman_vl,

Не инициализирована CGI среда скорее всего.
Например, выполняйте в SQL Worshop > SQL Commands.
...
Рейтинг: 0 / 0
04.08.2017, 14:50
    #39500335
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
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
04.08.2017, 18:05
    #39500442
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
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
04.08.2017, 18:15
    #39500452
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова apex_util.get_blob
В 5.1 onDemand так же называется Ajax Callback.
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Снова apex_util.get_blob / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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