DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

HTML со встроенными изображениями из PL/SQL

Фоновое изображение

Тег IMG позволяет вам включать изображения в HTML. Обычно тег имеет ссылку на изображение, как показано ниже.
Использование URL в теге говорит браузеру (или почтовому клиенту), что он должен обратиться с отдельным HTTP запросом для получения изображения. Альтернативно можно встроить изображение в тег IMG. Основной формат содержания тега показан ниже, где "mimetype" - тип изображения ("image/png", "image/gif" и т.д.), и "data" - закодированные данные base64, которые составляют изображение.
Есть несколько причин, почему Вы могли бы предпочесть этот метод:
  • Сокращение общего количества запросов HTTP может улучшить производительность, если вы не встраиваете большие изображения.
  • HTML может быть просмотрен офлайн. Например встраивание изображений вместо того, чтобы использовать URL в электронные письма HTML, может быть выгодным.
Эта статья иллюстрирует, как создать встроенное изображение в HTML, используя PL/SQL

Установка

Пример кода в этой статье требует, чтобы несколько объектов были созданы.
Во-первых, создайте объект directory, указывающий на физический каталог на сервере базы данных, на котором у пользователя Oracle есть полномочия чтения-записи. Он будет использоваться в примерах.
CONN / AS SYSDBA
CREATE OR REPLACE DIRECTORY images AS '/host/';
GRANT READ, WRITE ON DIRECTORY images TO test;
Затем, создайте и заполните таблицу, которая будет содержать изображения для примера. В этом случае я только использую единственное изображение, названное "site_logo.gif", который загружен в таблицу из каталога ''IMAGES', созданного ранее.
CONN test/test
CREATE TABLE images (
id NUMBER(10) NOT NULL,
name VARCHAR2(50) NOT NULL,
image BLOB NOT NULL,
CONSTRAINT images_pk PRIMARY KEY (id),
CONSTRAINT images_uk UNIQUE (name)
);
CREATE SEQUENCE images_seq;
DECLARE
l_dir VARCHAR2(10) := 'IMAGES';
l_file VARCHAR2(20) := 'site_logo.gif';
l_bfile BFILE;
l_blob BLOB;
BEGIN
INSERT INTO images (id, name, image)
VALUES (images_seq.NEXTVAL, l_file, empty_blob())
RETURN image INTO l_blob;
l_bfile := BFILENAME(l_dir, l_file);
DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
DBMS_LOB.loadfromfile(l_blob, l_bfile, DBMS_LOB.getlength(l_bfile));
DBMS_LOB.fileclose(l_bfile);
COMMIT;
END;
/
Пример HTTP нуждается в доступе к Интернету (или к другому серверу HTTP). Если Вы будете использовать Oracle 11g, то вы должны будете удостовериться, что соответствующий ACL присутствует, чтобы разрешить доступ к сети из базы данных.
Необходимо проверить, что HTML фактически сгенерирован правильно. Чтобы сделать это, мы запишем его в файловую систему, используя следующую процедуру.
CREATE OR REPLACE PROCEDURE create_file_from_clob (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_clob IN OUT NOCOPY CLOB)
AS
l_file UTL_FILE.file_type;
l_step PLS_INTEGER := 24573;
BEGIN
l_file := UTL_FILE.fopen(p_dir, p_file, 'w', 32767);
FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_clob) - 1 )/l_step) LOOP
UTL_FILE.put(l_file, DBMS_LOB.substr(p_clob, l_step, i * l_step + 1));
END LOOP;
UTL_FILE.fclose(l_file);
END;
/
Код для кодирования BLOB в Base64
CREATE OR REPLACE FUNCTION base64encode(p_blob IN BLOB)
RETURN CLOB
IS
l_clob CLOB;
l_step PLS_INTEGER := 24573; -- make sure you set a multiple of 3 not higher than 24573
BEGIN
FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_blob) - 1 )/l_step) LOOP
l_clob := l_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(p_blob, l_step, i * l_step + 1)));
END LOOP;
RETURN l_clob;
END;
/

Кодирование изображения

Исходное изображение могло быть получено из файловой системы, столбца BLOB в таблице в базе данных или запросе HTTP от сервера приложений. Мы будем иметь дело с каждым из этих случаев ниже.
Хотя я использую хранимые процедуры в этих примерах, в реальной системе код был бы помещен в PL/SQL пакеты.

Кодирование изображений из файловой системы


7bb7fc54

Следующая процедура использует пакет DBMS_LOB, чтобы считать блоки данных из BFILE, указывающего на изображение в файловой системе. UTL_ENCODE и пакеты UTL_RAW используются, чтобы закодировать данные и преобразовать их в строку, подходящую для включения в HTML.
CREATE OR REPLACE PROCEDURE get_enc_img_from_fs (p_dir IN VARCHAR2,
p_file IN VARCHAR2,
p_clob IN OUT NOCOPY CLOB)
AS
l_bfile BFILE;
l_step PLS_INTEGER := 24573;
BEGIN
l_bfile := BFILENAME(p_dir, p_file);
DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(l_bfile) - 1 )/l_step) LOOP
p_clob := p_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(l_bfile, l_step, i * l_step + 1)));
END LOOP;
DBMS_LOB.fileclose(l_bfile);
END;
/

Кодирование изображений из HTTP

Следующая процедура подобна предыдущей, кроме чтения данных чтений из запроса HTTP, а не из файловой системы.
CREATE OR REPLACE PROCEDURE get_enc_img_from_http (p_url IN VARCHAR2,
p_clob IN OUT NOCOPY CLOB)
AS
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
l_raw RAW(32767);
BEGIN
l_http_request := UTL_HTTP.begin_request(p_url);
l_http_response := UTL_HTTP.get_response(l_http_request);
BEGIN
LOOP
UTL_HTTP.read_raw(l_http_response, l_raw, 24573);
p_clob := p_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(l_raw));
END LOOP;
EXCEPTION
WHEN UTL_HTTP.end_of_body THEN
UTL_HTTP.end_response(l_http_response);
END;
END;
/
Альтернативно, вы можете получить тог же самый результата, используя подтип HTTPURITYPE URITYPE
CREATE OR REPLACE PROCEDURE get_enc_img_from_http (p_url IN VARCHAR2,
p_clob IN OUT NOCOPY CLOB)
AS
BEGIN
p_clob := p_clob || base64encode(HTTPURITYPE.createuri(p_url).getblob());
END;
/

Кодирование изображений и столбца BLOB

Следующая процедура кодирует изображение, сохраненное в столбце BLOB таблицы.
CREATE OR REPLACE PROCEDURE get_enc_img_from_tab (p_image_name IN VARCHAR2,
p_clob IN OUT NOCOPY CLOB)
AS
BEGIN
SELECT p_clob || base64encode(image)
INTO p_clob
FROM images
WHERE name = p_image_name;
END;
/

Тестирование

У нас теперь есть три процедуры, чтобы получить изображения, и закодировать их таким образом, что они могут быть добавлены к документу HTML. Затем мы должны написать код, чтобы генерировать некоторый HTML и вызывать одну из процедур, чтобы встроить в него данные изображения. Следующий код создает документ HTML во временном CLOB. Примеры всех трех вызовов процедуры присутствуют в тестовом коде, так что испытайте каждый из них поочередно.
Как только HTML находится во временном CLOB, он может быть опубликован как электронная почта, веб-страница (используя встроенный PL/SQL, или mod_plsql сервера приложений), или может быть записан в файловой системе. Для простоты в тесте будет использована только файловая система.
DECLARE
l_clob CLOB;
BEGIN
DBMS_LOB.createtemporary(l_clob, FALSE);
-- Build the start of the HTML document, including the start of the IMG tag
-- and place it in a CLOB.
l_clob := '
HTML со встроенными изображениями из PL/SQL

Test HTML with Embedded Image

And here it is:

Site Logo

The end.








jAntivirus
';
-- The CLOB now contains the complete HTML with the embedded image, so do something with it.
-- In this case I'm going to write it to the file system.
create_file_from_clob (p_dir => 'IMAGES',
p_file => 'EmbeddedImageTest.htm',
p_clob => l_clob);
DBMS_LOB.freetemporary(l_clob);
EXCEPTION
WHEN OTHERS THEN
DBMS_LOB.freetemporary(l_clob);
RAISE;
END;
/
Вывод от всех трех вызовов должен выглядеть одинаково. Не забудьте просматривать код страницы, чтобы убедиться, что изображение было встроено в HTML.
 


Качественные широкоформатные обои для рабочего стола. . Межкомнатные раздвижные двери из дуба и бука считаются нестандартным решением в современных. . Пальто и пуховики в Benetton - кошельки женские интернет магазин. Женские кошельки к 8 марта.