En el artículo de hoy quiero compartir una forma de previsualizar contenido BLOB, en este caso archivos PDF almacenados en una tabla de nuestro esquema, utilizando RESTful Services.

Crear Tabla Books

Para esta demostración he creado una tabla de ejemplo que contiene las siguientes columnas:

Su DDL es:

 CREATE TABLE "BOOKS" 
   ( "BOOK_ID" NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 
      INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
"BOOK_TITLE" VARCHAR2(100 CHAR), 
"BOOK_IMAGE" BLOB, 
"FILENAME" VARCHAR2(255), 
"MIMETYPE" VARCHAR2(255), 
"IMG_LAST_UPDATED" DATE, 
CONSTRAINT "BOOKS_PK" PRIMARY KEY ("BOOK_ID")
  USING INDEX  ENABLE
   ) ;
He cargado en esta tabla mis tres libros de APEX :), subiendo un PDF de una página con el nombre del libro, el subtitulo y la imagen de la portada.

Crear Página de Previsualización

Ahora que tenemos la tabla creada con datos, vamos a crear una página, en mi demostración tengo la página 4, con una región de informe clásico con la siguiente consulta SQL:
SELECT book_id,book_title
FROM books
Creamos 2 elementos de página de tipo Campo de Texto para mostrar el código y la URL del libro, solo a modo demostrativo.
P4_BOOK_ID
P4_BOOK_URL
Expandimos la región del informe clásico y seleccionamos la columna BOOK_ID, ya que haremos que esta columna sea una columna de tipo enlace y que se muestre un icono de tipo ojito.
Configuramos las siguientes propiesdades de la columna:
Columna: BOOK_ID
Tipo: Enlace
Cabecera: Ver
Destino:
         Tipo: Página en esta aplicación
          Página: 4
Definir Elementos:
          Nombre: P4_BOOK_ID
          Valor: #BOOK_ID#
Texto de Enlace: <span class=»t-icon fa fa-eye»></span>
Añadimos una región de contenido dinámico con el siguiente código de PL/SQL:
DECLARE
   Vurl varchar2(2000) := :P4_BOOK_URL;
BEGIN
   htp.p('<embed src="'||Vurl||'" width="1000" height="900">'); 
END;
Agregamos en Condiciones del Servidor –> Cuerpo de la Función, ingresamos el siguiente código de PL/SQL:
declare
  begin
    if :P4_BOOK_URL is not null then
      for c1 in (select nvl(dbms_lob.getlength(book_image),0) B
                 from books
                 where book_id = :P4_BOOK_ID)
      loop
        if c1.B > 0 then
          return true;
        end if;
      end loop;
    end if;
    return false;
end;
Guardamos la página.

Habilitar los Servicios RESTful

Ahora necesitamos acceder al módulo de los Servicios RESTful en nuestro espacio de trabajo.
Hacemos clic en el módulo del Taller de SQL, luego en Servicios RESTful, si no tenemos activado en nuestro esquema lo habilitamos con el ORDS RESTful Data Services haciendo clic en el botón de registrar esquema con ORDS.
Ingresamos un alias del esquema, en mi caso he utilizado el alias lab_cursos y guardamos la configuración.
Crear Módulo
Hacemos clic en módulos y creeamos un nuevo módulo que lo llamaremos Ver BLOB.
Crear Plantilla
Seguidamente creamos una plantilla, en el cual ingresamos en la URI de la plantilla blob/{id}
Crear Manejador
A continuación vamos a crear el manejador GET para esta plantilla.
En el origen del manejador ingresamos la siguiente consulta SQL:
select mimetype, book_image
from books
where book_id = :id

Finalizar demo y ver los resultados

Regresamos a la página 4 y seleccionamos el elemento de página P4_BOOK_URL y en sus propiedades en el valor por defecto ingresamos la URL que hace referencia al manejador GET.
https://…………………………..-1.oraclecloudapps.com/ords/lab_cursos/get/blob/{id}
Al ejecutar la página podemos ver el PDF que se muestra en la región de contenido dinámico, y podemos navegar por los distintos registros y ver que se previsualiza el PDF segun su código de libro.

Nota importante

En este artículo no hemos visto nada del tema de asegurar los recursos, si quieres conocer más a fondo el uso de los servicios RESTful y como proteger tus servicios RESTful te invito a mi nuevo curso sobre este tema tan importante en el desarrollo de aplicaciones web con Oracle APEX.
Aquí te dejo el enlace del curso con un 20% de descuento!
Hasta pronto!