17 de julio de 2007

VFP9 a MySQL5 - Almacenamiento de Imágenes

Últimante he leído en los foros sobre gente que tiene problemas a la hora de guardar imágenes en una base de datos de MySQL.

Vamos a solucionar esto desglosando tres pequeños ejemplos de almacenamiento de imágenes en MySQL.
  1. Crear una tabla en MySQL para almacenar las imágenes.
  2. Archivar una imágen en un campo de la tabla de nuestra base de datos.
  3. Proceder a su descarga posterior.
1. Crear una tabla de MySQL

Vamos a tener que crear una pequeña tabla en nuestra base de datos MySQL con la siguiente estructura:

CODIGO, DESCRIPCION, FOTO (Atención al campo foto ya que será del tipo BLOB)

Crearemos la tabla desde nuestro querido VFP.
********************************************
* CREACION DE TABLA (albumfotos)
********************************************

LOCAL CSQL, NH, CCADENA
CSQL=""
NH=0
CCADENA=""
CSQL= "DRIVER={MySQL ODBC 3.51 Driver};" + ;
"SERVER=127.0.0.1;" + ;
"PORT=3306;" + ;
"UID=usuario;" + ;
"PWD=pasword;" + ;
"DATABASE=mybasededatos;" + ;
"OPTIONS=2049;"

NH=SQLSTRINGCONNECT(""+CSQL, .T.)
IF NH > 0
        SQLSETPROP(NH,'Asynchronous', .T.)
        SQLSETPROP(NH,'BatchMode', .T.)
        TEXT TO CSQL TEXTMERGE NOSHOW

            CREATE TABLE albumfotos (
                codigo char(03) NOT NULL default '000',
                descripcion varchar(50) default '',
                foto longblob, 
                PRIMARY KEY (codigo)) 
                ENGINE=InnoDB ROW_FORMAT=DYNAMIC

        ENDTEXT
        SQLPREPARE(NH,""+CSQL)
        SQLEXEC(NH)

        WAIT WINDOW 'Tabla Creada'

        SQLDISCONNECT(NH)
 
ENDIF

RELEASE CSQL,NH,CCADENA
*************************************************************

2. Archivar imagen en la tabla de MySQL.

Vamos a archivar una imagen en la tabla (albumfotos). La imagen estará ubicada en el directorio raiz C:\ y será el archivo de imagen FOTO001.JPG

Crearemos una variable en VFP del tipo BLOB que contendrá la imagen antes de su posterior grabación: (En este caso omitiremos las ordenes de conexión a la base de datos)
********************************************
* ARCHIVAR IMAGEN 
********************************************

LOCAL BIMAGEN AS BLOB
BIMAGEN=(0h)         && Inicializamos la Variable
BIMAGEN=FILETOSTR("C:\FOTO001.JPG")

TEXT TO CSQL TEXTMERGE NOSHOW

        REPLACE INTO albumfotos 
                SET   CODIGO='001', 
                        DESCRIPCION='FOTO-001', 
                        FOTO=?BIMAGEN
 
ENDTEXT
SQLPREPARE(NH,""+CSQL)
SQLEXEC(NH)

WAIT WINDOW 'Imagen Grabada'

RELEASE BIMAGEN
*************************************************************

3. Extraer imagen de la tabla de MySQL.

Vamos a Extraer la misma imagen de la tabla de MySQL y ahora la guardaremos en el directorio fotos. (Obviamente en este caso también omitiremos las ordenes de conexión a la base de datos)
********************************************
* EXTRAER IMAGEN 
********************************************

TEXT TO CSQL TEXTMERGE NOSHOW

    SELECT FOTO
        FROM albumfotos WHERE CODIGO='001' 
ENDTEXT
SQLPREPARE(NH,""+CSQL,"TCURSOR")
SQLEXEC(NH)
SELECT TCURSOR
IF RECCOUNT() > 0
    STRTOFILE(TCURSOR.FOTO,"C:\FOTOS\FOTO001.JPG")
ENDIF

CLOSE TABLES ALL

********************************************
Esto no solo sirve para almacenar imágenes solamente, También es posible almacenar documentos PDF, Word, lo que se nos ocurra. Yo por ejemplo lo utilizo para almacenar cada logo de empresa en mi base de datos, para posteriormente imprimirlo en la cabecera de las facturas e informes.


Antonio L. Montagut
www.ontarioxb.es


5 comentarios :

  1. Hola, funciona bien con archivos tipo imagen, pero con otro tipo de archivos, xlsx, pdf etc... al descargar la imagen con strtofile() el archivo de descarga dañado y no se puede abrir. Sabes como manejar este tipo de archivo

    ResponderBorrar
  2. Al generar el exe, no me cargan las imagenes, pero en tiempo de diseño si me cargan normal. Cual puede ser el problema?

    ResponderBorrar
  3. AL EXTRAER IMAGEN DICE el valor, tipo o numero de argumento no es valido para la funcion!!!, y no saca la imagen, que puede ser, probe varios formatos de imagen y pasa lo mismo

    ResponderBorrar
    Respuestas
    1. para solucionar "AL EXTRAER IMAGEN DICE el valor, tipo o numero de argumento no es valido para la funcion!!!,"
      foto = CAST(TCURSOR.FOTO as blob)
      STRTOFILE(foto,"C:\FOTOS\FOTO001.JPG")

      Borrar
  4. Hola, Muchas gracias. Funciona Bien. ¿y como la visualizo en un formulario?

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.