Vamos a solucionar esto desglosando tres pequeños ejemplos de almacenamiento de imágenes en MySQL.
- Crear una tabla en MySQL para almacenar las imágenes.
- Archivar una imágen en un campo de la tabla de nuestra base de datos.
- Proceder a su descarga posterior.
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
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
ResponderBorrarAl generar el exe, no me cargan las imagenes, pero en tiempo de diseño si me cargan normal. Cual puede ser el problema?
ResponderBorrarAL 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
ResponderBorrarpara solucionar "AL EXTRAER IMAGEN DICE el valor, tipo o numero de argumento no es valido para la funcion!!!,"
Borrarfoto = CAST(TCURSOR.FOTO as blob)
STRTOFILE(foto,"C:\FOTOS\FOTO001.JPG")
Hola, Muchas gracias. Funciona Bien. ¿y como la visualizo en un formulario?
ResponderBorrar