Wavemaker, Listar y descargar archivos desde MySQL

Una de las funciones que he necesitado y me han ayudado mucho es poder ver o descargar archivos (tipo blob, o longblob) desde una base de datos.
Espero que este ejemplo les sea de ayuda y les sirva para integrarlo en otros proyectos:


  1. Lo primero es el modelo: para facilidad al obtener la descarga, vamos a guardar todos los archivos en una sola tabla y en las demás solo se verán como una FK. aunque también se podría dejar el nombre y el id. Esto también puede sernos de utilidad si para hacer el upload usamos el widget FancyUpload. Veamos el modelo:     
  2.  Lo otro que necesitamos es el query en HQL  en nuestro proyecto. Luego de importar la base de datos. Creamos el query que traerá los datos del archivo del contacto dependiendo de la relación. 

3. Y lo para hacer la descarga haremos un JavaService.

Este es el código y la explicación.


/* Importamos las librerias para poder leer el archivo,
*  pasa saber dónde esta y para poder descargarlo */
import java.io.ByteArrayInputStream;
import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap;
import org.springframework.web.multipart.MultipartFile;

import com.activegrid.runtime.AGRuntime;
import com.wavemaker.runtime.server.DownloadResponse;
import com.wavemaker.runtime.server.ParamName;

/* importamos las clases de nuestra base de datos y nuestras tablas*/
import com.Contactos;
import com.data.Archivos;
public class ArchivoContacto{
          //Nuestra funcion: este idArchivo es la FK que traemos de la tabla contactos
    public DownloadResponse  descargaArchivo(String idArchivo){ 
        /* DownloadResponse es una clase de WM que nos permite generar la descarga*/
        DownloadResponse ret = new DownloadResponse();
        
        /* ConfigurableMimeFileTypeMap  es una clase que nos permite conocer el tipo de archivo que vamos a descargar*/
        ConfigurableMimeFileTypeMap mimeFileTypeMap = new ConfigurableMimeFileTypeMap();
        /* Creamos un objeto de nuestra base de datos*/
        Contactos contacto = (Contactos) AGRuntime.getInstance().getService("contactos");
        //iniciamos nuestro objeto
        contacto.begin();
        try{
          /*creamos el objeto Archivo trajendolo de la base de datos con el query que creamos*/
          Archivos archivo=contacto.getArchivosById(new Integer(idArchivo));
          /* buscamos el tipo de archivo a descargar segun el nombre*/
          ret.setContentType(mimeFileTypeMap.getContentType(archivo.getNombre()));
          /* descargamos el contenido del archivo */
          ret.setContents(new ByteArrayInputStream(archivo.getArchivo()));
          /* le damos nombre al archivo segun el que trae de la base de datos*/
          ret.setFileName(archivo.getNombre());
        }finally{
        /* cerramos la conexion */
          contacto.rollback();
        }
        /* retornamos el objeto DownloadResponse, con el archivo para la descarga*/
        return ret;
    }
}
4. Podemos traer la función de este servicio y ponerlo en un enlace de descarga o si es una imagen en un widget tipo imagen. de la siguiente manera.
"services/archivoContacto.download?method=descargaArchivo&idArchivo="+${gridContactos.selectedItem.archivos.idarchivos} 
         utilizamos esta llamada en la opcion source de una imagen o en la opcion link de un label


Y Listo ya podemos ver nuestro proyecto.

Espero sea de ayuda. 
Aca quedan los archivos para descarga: 
http://tecnologiaymarketing.com/elin3t/contactosDB.zip el proyecto para importarlo en Wavemaker
http://tecnologiaymarketing.com/elin3t/contactosWM.sql el SQL
http://tecnologiaymarketing.com/elin3t/contactosWM.mwb y el modelo ER para MySQL Workbech

Comentarios

Entradas populares de este blog

Los 5 vídeos más impresionantes de la semana #5

Enlaces rápidos (30-03-2010)

Las mejores bromas de Google por el April Fools Day