Ekaterina B. Egorkina,© VEELTECH.RU Загрузка и вывод изображений Каким образом можно сохранить картинку в БД, а потом отобразить ее на странице? Задача: добавить возможность хранения и отображения фотографий сотрудников. Фотография должна появляться на странице редактирования данных сотрудника и в общем списке для каждого сотрудника.
Ekaterina B. Egorkina,© VEELTECH.RU Начнем со страницы редактирования данных сотрудника. Здесь появляется элемент, который позволяет выбрать файл с изображением и сохраняет выбранное изображение в БД. Элемент для загрузки изображения
Ekaterina B. Egorkina,© VEELTECH.RU Кнопка «Обзор» вызывает диалоговое окно выбора файла.
Ekaterina B. Egorkina,© VEELTECH.RU После выбора изображения, имя файла с полным адресом появляется в диалоговом элементе «Загрузка фотографии». Чтобы информация попала в БД, остается нажать «Сохранить».
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU При повторном открытии карточки личных данных, появляется изображение, сохраненное в БД.
Ekaterina B. Egorkina,© VEELTECH.RU alter table EMPLOYEES add ( PHOTO blob null ); Для загрузки фотографии в БД нужно подготовить место. Бинарная информация такого рода хранится в объектах типа BLOB. Следовательно, добавим в таблицу сотрудников (EMPLOYEES) новое поле PHOTO.
Ekaterina B. Egorkina,© VEELTECH.RU Перед началом работы над добавлением в приложение APEX возможности работы с фотографиями сотрудников, необходимо создать связанную пару страниц с отчетом, где формируется полный список сотрудников, и связанной с ним формой для редактирования каждой записи. Элементы Report and Form.
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU Пометим элемент как «Загрузка фотографии»
Ekaterina B. Egorkina,© VEELTECH.RU Т.к. предполагается хранить фотографии в таблице EMPLOYEES, то тип хранения должен быть задан как BLOB column specified in Item Source attribute Параметр размещения содержимого имеет 2 варианта: 1. Inline – отображение информации непосредственно на странице (возможность зависит от настроек браузера и поддерживаемых форматов) 2. Attachment – отображение ссылки для загрузки содержимого
Ekaterina B. Egorkina,© VEELTECH.RU Это те самые атрибуты источника информации (Item Source attribute). Тип источника (Source Type) – поле таблицы (Database Column). Имя поля (Database Column Name) – созданное поле PHOTO таблицы EMPLOYEES. Важно! Параметр времени использования (Source Used) должен быть установлен в значение «Всегда» (Always).
Ekaterina B. Egorkina,© VEELTECH.RU Т.к. вариант отображения Inline для объекта File Browse доступен не всегда, сделаем отдельное отображение картинки через элемент Display Image.
Ekaterina B. Egorkina,© VEELTECH.RU Последовательность размещения данного элемента несколько иная, чем обычно. Чтобы расположить картинку справа от остальных элементов, ее необходимо поместить во вторую колонку первой строки невидимой таблицы, с помощью которой форматируется вывод объектов в регионе. Поэтому, элемент должен следовать между первым и вторым элементом, которые уже присутствуют на странице. Это соответствует любому значению от 11 до й элемент Создаваемый элемент 2-й элемент 3-й элемент …
Ekaterina B. Egorkina,© VEELTECH.RU Элемент не располагается на новой строке, т.к. будет размещаться во 2-й колонке первой строки.
Ekaterina B. Egorkina,© VEELTECH.RU Способ хранения информации аналогичен предыдущему элементу.
Ekaterina B. Egorkina,© VEELTECH.RU Параметры источника информации аналогичны предыдущему элементу.
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU Т.к. картинка имеет высоту большую, чем обычные однострочные элементы, то, во избежание растяжения первой строки на высоту картинки, объединим все ячейки 2-й колонки форматирующей таблицы. 1-й элемент Элемент Display Image 2-й элемент 3-й элемент …
Ekaterina B. Egorkina,© VEELTECH.RU Для отображения данных, хранящихся в поле BLOB в виде изображения, недостаточно добавить выбор соответствующего поля в запрос SELECT. В обычном отчете (report) с запросом select employee_id, last_name, photo from employees для поля PHOTO будет сформирована ссылка, по которой можно загрузить соответствующее содержимое Чтобы вместо ссылки добавить изображение, для этого поля необходимо вручную определить HTML-код тега.
Ekaterina B. Egorkina,© VEELTECH.RU Формируемый запросом тэг будет иметь следующий вид: Главная задача – получить адрес, по которому через протокол http можно получить изображение. Сформировать адрес позволяет функция APEX_UTIL.get_blob_file_src
Ekaterina B. Egorkina,© VEELTECH.RU Синтаксис: APEX_UTIL.get_blob_file_src( p_item_name in varchar2 default null, p_v1 in varchar2 default null, p_v2 in varchar2 default null, p_content_disposition in varchar2 default null) return varchar2; p_item_name – элемент типа FILE на заданной странице, связанный с источником значений для поля BLOB в БД p_v1 – значение первичного ключа данной записи p_v2 – значение второго поля, входящего в первичный ключ (для составного ключа) p_content_disposition – inline или attachment
Ekaterina B. Egorkina,© VEELTECH.RU 1. Необходим элемент, являющийся источником данных поля BLOB, где хранится изображение. Это элемент типа File Browse, где источник (Source) задан как Source type: Database Column Source value: PHOTO (поле BLOB,где хранится фото) 2. Необходим элемент, где будет задано значение идентификатора записи. Это элемент типа Hidden, где источник (Source) задан как Source type: Database Column Source value: EMPLOYEE_ID (первичный ключ таблицы)
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU Чтобы сделать невидимым все, что содержится в регионе, в параметрах Header and Footer – заголовок и окончание региона – пропишем специальный html-блок span, скрытый с помощью стилей CSS.
Ekaterina B. Egorkina,© VEELTECH.RU Отображение региона без шаблона. В этом случае никаких элементов оформления – рамка, заголовок и т.д. не добавляется.
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU Аналогичны создававшемуся ранее элементу File Browse для формы редактирования.
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU Чтобы в созданных объектах (File Browse и Hidden) появлялись данные из таблицы, необходимо создать для них «источник информации». Таким источником является специальный процесс (Process), выполняющий автоматическое считывание записей (Automated Row Fetch) указанной таблицы по заданному описанию.
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU SELECT …, decode( nvl(dbms_lob.getlength(PHOTO),0),0,null, '<img style="border: 1px solid #CCC;" '|| 'src="'|| apex_util.get_blob_file_src('P2_PHOTO',employee_id)|| '" height="45" width="45" alt="Photo" title="Photo" />' ) as PHOTO FROM EMPLOYEES
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU
Ekaterina B. Egorkina,© VEELTECH.RU