Carga de Archivos en Apex 4.0

En esta ocasión coloco la versión de Apex en el título, por que no sé si en versiones anteriores sea así de fácil. Pero igual podrian intentar, me avisan si les sirve :P.

Para carga un archivo nuestra tabla debe tener al menos un campo de tipo Blob para almacenar el archivo, y uno para el nombre o para el tipo de archivo, ya que si no los colocamos, al descargarlo el archivo estará sin nombre ni extención, para eso usaremos la columna del nombre, ya que así lo guarda con todo y extensión. Como siempre, pueden descargar los archivos de la aplicación de ejemplo aquí.
Pero si les da pereza instalarla y todo, les explico lo básico. Trabajaremos en las páginas de Albums y Álbum como pudieron ver en el vídeo, la primera sera un reporte con un link de descarga del archivo y la segunda permitirá visualizarlo, cargarlo, y eliminarlo.

El script de la tabla con la que trabajaremos es el siguiente:
create table RELEASE 
(
   ID_RELEASE           NUMBER               not null,
   ID_ARTIST            NUMBER               not null,
   NAME_RELEASE         VARCHAR2(100)        not null,
   DATE_RELEASE         DATE                 not null,
   COVER                BLOB,
   COVER_NAME           VARCHAR2(100),
   COVER_MIME           VARCHAR2(20),
   constraint PK_RELEASE primary key (ID_RELEASE)
);
COVER sera donde almacenemos la caratula del álbum, COVER_NAME tendrá el nombre del archivo, y COVER_MIME tendrá el tipo de archivo.

Para crear el reporte usamos la siguiente Query, en la aplicación tiene más cosas, pero acá les muestro lo básico. Lo más importante es el id o ROWID y dbms_lob.getlength("COVER").
select 
"ID_RELEASE",
"NAME_RELEASE",
dbms_lob.getlength("COVER") "COVER",
 from   "RELEASE"
Trabajaremos sobre la columna COVER, ingresamos a propiedades de la columna, colocamos el tipo de visualización (Display Type) como "Mostrar como texto" y para el formato, damos click en el link "Blob Download format" (Máscara de Formato de Descarga BLOB), esto nos abrirá la siguiente ventana, en la cual colocaremos las opciones correspondientes.

En caso de que no aparezca este link, podemos colocar la mascara manualmente colocando las opciones separadas por dos puntos, el orden de las opciones es el siguiente.

[IMAGE | DOWNLOAD]: IMAGE incida que el archivo es una imagen y queremos que se muestre en el reporte, si seleccionamos DOWNLOAD nos mostrara un enlace para descargarla.
TABLA: El nombre de la tabla que contiene la columna con el archivo.
COLUMNA: El nombre de la columna que contiene el archivo.
LLAVE_PRIMARIA: EL nombre de la llave primaria de la tabla que contiene laa columna con el archivo.
SEGUNDA_LLAVE_PRIMARIA: Opcional para las tablas que tienen llaves primarias compuestas.
CULUMNA_MIME: Opcional, El nombre de la columna que contiene el tipo de archivo.
COLUMNA_NOMBRE: Opcional, El nombre de la columna que contiene el nombre del archivo y sera el mismo con el que quede al descargarlo.
COLUMNA_ULTIMA_MODIF: Opcional, Indica el nombre de la columna que tiene la fecha en la que se modifico el archivo
CHARSET: Opcional, La columna que tiene la clase de Charset del Archivo
[attachment | inline]: attachment indica que al dar click en el link de descarga se descargara el archivo, inline indica que al dar click en el link de descarga el explorador interpretara el archivo de acuerdo al tipo de este, por ejemplo, si es una imágen, se mostrara en el explorador, si es un PDF y tenemos el plugin necesario, se visualizara en el explorador en lugar de descargarlo directamente.
Texto de Descarga: Es el texto que se mostrara para descargar el archivo.

Como hay algunas opciones que son opcionales, podemos dejarlas en blanco, pero aún así dejamos los dos puntos, como ejemplo así quedaría la cadena con las opciones de la imagen:

DOWNLOAD:RELEASE:COVER:ID_RELEASE::COVER_MIME:COVER_NAME:::attachment:Descargar

hasta aquí hemos trabajado con el reporte, ahora haremos pasaremos a la siguiente página, Para facilitar las cosas la creamos con el asistente de Apex, para que nos cree los métodos de fetch column y proccess column. Adicionalmente crearemos dos items más, uno de tipo "Display Image" y el otro un "Check Box", este ultimo con solo una opción.

Display Image: Esta tendrá las siguientes opciones, en el primer bloque definimos la columna que tendrá el nombre del archivo, ara que quede este mismo al ser descargado.
En el segundo bloque, en atributos de elemento, podemos definir el tamaño con el que queremos que se muestre la imagen, En el siguiente definimos el origen del item y lo colocamos como columna de base de datos y seleccionamos la de tipo BLOB. En el ultimo, el de condiciones, solo validamos que ese registro tenga algo en el Blob, para que no se muestre cuando no hay nada con la siguiente query
Select * from RELEASE 
WHERE ID_RELEASE = :P6_ID_RELEASE AND COVER IS NOT NULL
Check Box: Lo único que tendrá de especial sera la misma condición del ítem "Display Image" y que solo tendrá una opción que retorne el valor 1. en este caso no le coloque label ya que la misma opción da la información necesaria.

File Explorer: este tiene casi las mismas opciones que nos aparecían para la mascara de la columna del reporte de tipo Blob. Solo que aquí ademas de usarlas para el link de descarga, las usara para guardar dicha información en estas columnas.

Ya que Apex crea el proceso para crear, actualizar y eliminar el registro de la tabla, solo debemos crear uno para eliminar el archivo, este se ejecutara cuando el item del Check Box tenga un valor de 1 y ejecutara el siguiente procedimiento
update RELEASE
SET COVER = NULL,
 COVER_NAME = NULL,
 COVER_MIME = NULL
WHERE ID_RELEASE = :P6_ID_RELEASE;

Y con esto hemos acabado Y ahora a celebrar :D. aunque hum... creo que se me olvida algo.... ah si... obvio, como esto fue algo de prueba y error, no tengo referencias de eso, intente hacer que en el reporte se mostrara la caratula del álbum de un tamaño pequeño, pero no pude, encontré una forma pero tocaba crear un proceso, unos sinónimos y bajh, me dio pereza :P, Pero si no son perezosos o realmente necesitan eso, lo pueden ver acá.
How to show BLOB type Column as image in APEX


Y así algunos problemas que tuve fue que creando el reporte manualmente, este mostraba una columna con el ID, pero la columna del BLOB buscaba por el ROWID, entonces es importante que eso coincida. Otro fue que casi no caigo en cuenta de que tocaba dejar la opción de eliminar la imagen :P. Y no recuerdo más, cualquier pregunta que tengan o error me dicen :)

Y ahora si, si todo sale bien, A celebrar :D jeje, ya sé, siempre pongo esto, pero me encanta este gif de Kashiyuka :)



El Vídeo de este post es uno que definitivamente tienen que ver, independientemente de si les gusta o no la música de Perfume, aprecien la tecnología usada en esta presentación, creo que se llama "Pepper's ghost", o simplemente Hologramas jaja, disfruten del vídeo, lo mejor empieza cerca al tercer minuto.

Comments

Popular posts from this blog

View PDF File on APEX (Simple approach)

Set Custom APP Icon on APEX

ID Basado en trigger y secuencia para todas las tablas - Oracle