ВАША ТАБЛИЦА ДОЛЖНА СОДЕРЖАТЬ СЛЕДУЮЩУЮ КОЛОННУ ДЛЯ РАБОТЫ:
. . .. . .. . . .. . …………………… нулевой
IMAGE BLOB ………………… …Да — -
FILENAME VARCHAR2(1000). Да — -
MIMETYPE VARCHAR2(1000) Да — -
IMAGE_LAST_UPDATE DATE. ДА - -
1- перейдите в «Общие компоненты», затем в «Элементы приложения» добавьте элемент приложения EMP_ID в моем случае.
2- внутри элемента приложения добавить в защиту статистики сеанса Неограниченно
3- перейдите в браузер obj и создайте процедуру:
create or replace PROCEDURE DISPLAY_IMAGE(lgs_per_v IN NUMBER) AS CURSOR Sel_Prs IS SELECT IMAGE, DBMS_LOB.GETLENGTH(IMAGE) AS length_img, MIMETYPE, FILENAME FROM lgs_person WHERE code = lgs_per_v; Prs_R Sel_Prs%ROWTYPE; L_LENGTH NUMBER; L_FILE_NAME VARCHAR2(2000); LOB_LOC BLOB; L_MIME VARCHAR2(255); BEGIN OPEN Sel_Prs; FETCH Sel_Prs INTO Prs_R; CLOSE Sel_Prs; sys.HTP.init; sys.OWA_UTIL.mime_header(Prs_R.mimetype, FALSE); sys.HTP.p('Content-Length: ' || DBMS_LOB.getlength(Prs_R.image)); sys.HTP.p('Content-Disposition: filename="' || Prs_R.filename || '"'); sys.OWA_UTIL.http_header_close; sys.WPG_DOCLOAD.download_file(Prs_R.image); apex_application.stop_apex_engine; EXCEPTION WHEN apex_application.e_stop_apex_engine THEN NULL; end;
Предоставленный код представляет собой процедуру PL/SQL, которая отображает изображение, хранящееся в столбце BLOB (большой двоичный объект) таблицы. Давайте разберем код и объясним каждый раздел:
- Оператор
CREATE OR REPLACE PROCEDURE
используется для определения или замены хранимой процедуры в базе данных. - Процедура называется
DISPLAY_IMAGE
и ожидает один входной параметрlgs_per_v
типа NUMBER. - Объявлен курсор с именем
Sel_Prs
. Он выполняет запрос SELECT к таблицеlgs_person
, извлекая столбцыIMAGE
,MIMETYPE
иFILENAME
, где столбецcode
соответствует входному параметруlgs_per_v
. - Переменная
Prs_R
объявлена как тип записи, соответствующий структуре строк курсораSel_Prs
. - Объявляются дополнительные переменные:
L_LENGTH
типа NUMBER,L_FILE_NAME
типа VARCHAR2(2000),LOB_LOC
типа BLOB иL_MIME
типа VARCHAR2(255). - Оператор
OPEN
используется для открытия курсораSel_Prs
. - Оператор
FETCH
извлекает следующую строку из курсора и сохраняет ее в переменной записиPrs_R
. - Оператор
CLOSE
используется для закрытия курсораSel_Prs
. - Процедура
sys.HTP.init
инициализирует буфер HTTP для генерации ответа HTTP. sys.OWA_UTIL.mime_header
вызывается для установки MIME-типа ответа на основе значенияPrs_R.mimetype
. Второй параметр имеет значениеFALSE
, чтобы указать, что ответ не должен кодироваться автоматически.sys.HTP.p
используется для записи текста в ответ HTTP. ЗаголовокContent-Length
устанавливается с помощью функцииDBMS_LOB.getlength(Prs_R.image)
для определения длины данных изображения. ЗаголовокContent-Disposition
указывает имя файла изображения с использованиемPrs_R.filename
.sys.OWA_UTIL.http_header_close
вызывается для закрытия заголовков ответа HTTP.sys.WPG_DOCLOAD.download_file
используется для загрузки данных BLOB из столбцаPrs_R.image
и отправки их в качестве тела ответа.apex_application.stop_apex_engine
вызывается для остановки механизма APEX, который завершает обработку текущего приложения APEX.- Раздел
EXCEPTION
обрабатывает исключения, которые могут возникнуть во время выполнения процедуры. В этом случае исключениеWHEN apex_application.e_stop_apex_engine
перехватывается и игнорируется.
В целом, этот код извлекает изображение из базы данных на основе заданного кода, устанавливает соответствующие заголовки HTTP для ответа и отправляет данные изображения в качестве тела ответа HTTP.
4- После создания процедуры перейдите в «Общие компоненты», затем откройте «Процессы приложений» и добавьте процесс:
5- Установите точку процесса (требуемое значение):
Обратный вызов Ajax: запускайте этот процесс приложения по запросу процесса страницы.
6- добавьте следующий код:
:BEGIN DISPLAY_IMAGE(:EMP_ID); END;
Вот почему мы создали emp_id для хранения отображаемых данных.
Я использую плагин под названием FOS, который ВЫ МОЖЕТЕ найти в apex world.
этот плагин позволит мне отображать HTML, ИСПОЛЬЗУЯ HTP.P
7- в наборе атрибутов:
Метод вывода: прямой вывод через htp.p
и добавьте следующий код:
DECLARE Cursor Sel_Prs is select ACTIVE_FLG,DIRECT_TELEPHONE,EMAIL,POSITION_DESC,E_NAME,IMAGE from lgs_person where code = :P47_EMP; Prs_R Sel_Prs%rowtype; BEGIN OPEN Sel_prs; FETCH Sel_Prs INTO Prs_R; CLOSESel_Prs; HTP.p('<div class="card">'); HTP.p('<div class="team-image-wrapper">'); If Prs_R.IMAGE is null then /*DEFAULT IMAGE*/ HTP.p('<img class="team-member-image" src=#APP_FILES#user%20default.jpeg>'); ELSE /* OUR CODE THAT WILL DISPLAY THE IMAGE */ htp.p('<img src="f?p=&APP_ID.:1:&APP_SESSION.:APPLICATION_PROCESS=DISPLAY_IMAGE:::EMP_ID:'||:P47_EMP||'">'); END IF; END;
Вот разбивка строки URL:
f?p=
: Обычно это синтаксис, используемый в Oracle Application Express (APEX) для указания запроса страницы.&APP_ID.
: это заполнитель, который следует заменить фактическим идентификатором приложения APEX. Приложения APEX идентифицируются уникальным идентификационным номером.:1:
: Эта часть представляет собой номер страницы в приложении APEX, к которой необходимо получить доступ.&APP_SESSION.
: это еще один заполнитель, который следует заменить активным идентификатором сеанса APEX. APEX поддерживает информацию о сеансе для каждого пользователя.APPLICATION_PROCESS=DISPLAY_IMAGE
: указывает имя процесса приложения в APEX, который должен быть выполнен. В данном случае это относится к процедуре PL/SQL с именемDISPLAY_IMAGE
.:::EMP_ID:'||:P47_EMP||'
: эта часть содержит заполнитель:P47_EMP
, который следует заменить значением элемента страницы с именемP47_EMP
.EMP_ID
— это параметр, передаваемый процедуреDISPLAY_IMAGE
.
Когда этот фрагмент HTML отображается на веб-странице, браузер интерпретирует тег <img>
и делает запрос к указанному URL-адресу, заменяя заполнители соответствующими значениями. Затем приложение APEX выполнит процедуру DISPLAY_IMAGE
, извлечет данные изображения на основе предоставленного EMP_ID
и отправит их обратно в качестве ответа. Браузер отобразит изображение на веб-странице.
Таким образом, этот код используется для динамического создания тега <img>
с URL-адресом, который инициирует выполнение процедуры DISPLAY_IMAGE
в приложении Oracle APEX, позволяя отображать изображение, соответствующее определенному параметру EMP_ID
.
Спасибо за чтение! Надеюсь, объяснение было для вас полезным. Если у вас есть еще вопросы или вам нужна дополнительная помощь, не стесняйтесь спрашивать. Не забудьте подписаться на дополнительные советы и информацию. Берегите себя и хорошего дня! :)