Page 1 of 2
Imagenes en Postgress - SOLUCIONADO
Posted: Fri Apr 17, 2015 4:27 pm
by leandro
Compañeros del Foro bueno dias....
Que pena molestar de nuevo, pero es que ando requiriendo almacenar imágenes dentro de una tabla de
postgress, del foro encontré un ejemplo que almacena varias imágenes en mysql.
Code: Select all | Expand
#include "FiveWin.Ch"
#include "xbrowse.ch"
#include "adodef.ch" // IMPORTANT
function mysqlimages()
local oCn, oRs, cSql, a
local cPath := "c:\fwh\bitmaps\pngs\"
local cPassWord := <yourpasswordhere>
oCn := FW_OpenAdoConnection( { "MYSQL", "localhost", "FWH", "root", cPassWord } )
if FW_AdoTableExists( "IMAGETEST", oCn )
oCn:Execute( "DROP TABLE IMAGETEST" )
endif
FWAdoCreateTable( "IMAGETEST", ;
{ { "IMGNAME", 'C', 20, 0 }, ;
{ "IMAGE", 'm', 10, 0 } }, ; // small 'm' indicates binary data
oCn )
for each a in Directory( cPath + "*.png" )
cSql := SQL ; // SQL is FWH command
INSERT INTO IMAGETEST ( IMGNAME, IMAGE ) ;
VALUES ( a[ 1 ], MemoRead( cPath + a[ 1 ] ) )
oCn:Execute( cSql )
next
oRs := FW_OpenRecordSet( oCn, "IMAGETEST" )
XBROWSER oRs TITLE "IMAGES IN MYSQL" SETUP ( ;
oBrw:nEditTypes := EDIT_GET, ;
oBrw:lCanPaste := .t. )
oRs:Close()
oCn:Close()
return nil
Realice las pruebas y funciona "correctamente", aunque tuve problemas con imágenes de gran tamaño. No las almacena. Pero funciona.
Trate de hacer el cambio a
postgress pero hasta ahora sin buenos resultados; cambie el motor y el campo donde se almacena la imagen por bytea. Pero nada sin exito.
Los instrucciones que utilice son las siguientes:
Code: Select all | Expand
vRuta:="c:\fwh1501\bitmaps\jpg\surf.jpg"
vImag:=MemoRead( vRuta )
cSql := SQL ; // SQL is FWH command
INSERT INTO lyma_imagen ( pp_rutass, pp_imagen ) VALUES ( vRuta, MemoRead( vRuta ) )
msginfo(cSql)
TRY
oCn:Execute( cSql )
CATCH oError
FW_ShowAdoError(oCn)
END
Pero me sale un error desde ADO que dice... error de sintaxis
Alguien a tenido experiencia en esto?
Saludos
Re: Imagenes en Postgress
Posted: Sun Apr 19, 2015 3:11 am
by carlos vargas
leandro, usa filestr como funcion para leer los archivos, esto le usado desde hace tiempo y funciona muy bien.
ahora, que tipo de columna estas usando para almacenar lo leido?
Code: Select all | Expand
cFileStr := hb_strtohex( filestr( "c:\test\test.jpg" ) )
para realizar el proceso contrario, usa strfile y hb_hextostr.
salu2
carlos vargas
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 1:10 pm
by nageswaragunupudi
carlos vargas wrote:leandro, usa filestr como funcion para leer los archivos, esto le usado desde hace tiempo y funciona muy bien.
ahora, que tipo de columna estas usando para almacenar lo leido?
Code: Select all | Expand
cFileStr := hb_strtohex( filestr( "c:\test\test.jpg" ) )
para realizar el proceso contrario, usa strfile y hb_hextostr.
salu2
carlos vargas
All such things and more are built into SQL translate provided by FWH.
Using SQL commands of FWH, we need not think any more about conversion of data suitable to SQL Server.
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 1:13 pm
by nageswaragunupudi
I do not have personal experience with Postgre SQL, but I shall study the documentation and get back on the subject. So far FWH libraries take care of creating suitable field types and binary data conversion for only Microsoft databases, MySql, SQLite3 and Oracle.
Meanwhile can you please let me know the FieldType you used to create the field?
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 1:46 pm
by nageswaragunupudi
Mr leandro
You said you had difficulty with large images.
FWAdoCreateTable() function creates the binary field as "LONGBLOB" field type. This should accommodate any size of image we handle. But the problem may come from the maximum buffer size we can send to the MySql server. For this you need to set server parameters.
Please see about "max_allowed_packet" parameter in MySql documentation.
Otherwise you should use
oRs:Fields( n ):AppendChunk( cPart ) repeatedly
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 2:42 pm
by nageswaragunupudi
postgre:
Did you use BITEA field type for binary data?
First please try inserting small data.
It appears postgre ver 9.0 and later accept Hex format like this:
E'x\\<hex>
or in all versions
E'\\octal\\octal, etc
Let us first start with some test data and try this:
Code: Select all | Expand
vRuta:="c:\fwh1501\bitmaps\jpg\surf.jpg"
vImag:=MemoRead( vRuta )
cHex := "E'\\x" + STRTOHEX( vImag )
cSql := "INSERT INTO lyma_imagen ( pp_imagen ) VALUES (" + cHex + ")"
oCn:Execute( cSql )
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 3:46 pm
by leandro
Mr Rao y Carlos... Como siempre muy gentiles. Gracias por las respuesta.
Voy a analizar y probar todas las ideas que me han dado y al rato les comento los resultados.
Carlos:
Te cuento que definí la columna de tipo bytea.
Voy a probar con las funciones que mencionas y te comento
De nuevo gracias por las respuestas.
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 4:43 pm
by carlos vargas
esto lo he probado en mysql y mssql con campos de tipo text.
salu2
carlos vargas
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 7:19 pm
by leandro
Carlos Buenas tardes... Intente de la forma que me sugeriste pero al compilar me arroja los siguientes errores:
Code: Select all | Expand
Error: Unresolved external '_HB_FUN_HB_STRTOHEX' referenced from C:\CARTERA\PRG\R32_PROY.OBJ
Me Imagino que es alguna libreria que no he incluido... pero no se cual es?
Mr. Rao:
Compile tu ejemplo pero no funciona.... sale un error y dice que el programa dejo de funcionar... pero no hace nada.
Para ser exacto se queda bloqueado.
Tengo Instalada la versión
La tabla la creo de la siguiente manera:
Code: Select all | Expand
*---------------------> 42 <----------------------------*
cQuery := "CREATE TABLE IF NOT EXISTS lyma_imagen "
cQuery += "("
cQuery += "pp_itemga serial NOT NULL,"
cQuery += "pp_rutass VARCHAR(200) NULL ,"
cQuery += "pp_imagen bytea NULL,"
cQuery += " PRIMARY KEY (pp_itemga)"
cQuery += ") "
TRY
oLamcla:oCon:Execute(cQuery)
CATCH oError
FW_ShowAdoError(oLamcla:oCon)
END
//oProgress:nPosition += 1
sysrefresh()
Re: Imagenes en Postgress
Posted: Mon Apr 20, 2015 7:28 pm
by nageswaragunupudi
HB_STRTOHEX in Harbour is same as STRTOHEX in xHarbour.
If you are using, you may use STRTOHEX instead of HB_STRTOHEX.
Re: Imagenes en Postgress
Posted: Tue Apr 21, 2015 5:02 pm
by leandro
Bueno días....
Les cuento que ya logre convertir y almacenar el archivo en la base de datos, el código quedo de la siguiente manera:
Code: Select all | Expand
cFileStr := strtohex( filestr( "c:\fwh1501\bitmaps\jpg\lote.jpeg" ) )
MSGINFO(VALTYPE(cFileStr))
cSql:="INSERT INTO lyma_imagen (pp_rutass,pp_imagen) VALUES ('"+alltrim("c:\fwh1501\bitmaps\jpg\lote.jpeg")+"','"+cFileStr+"')"
//msginfo(cSql)
TRY
oCn:Execute( cSql )
CATCH oError
FW_ShowAdoError(oCn)
END
También logre recuperar la imagen que esta en la base de datos "bueno eso creo", de la siguiente manera:
Code: Select all | Expand
oVar := "SELECT * from lyma_imagen WHERE pp_itemga=1"
TRY
oRsDocfac:=tOleAuto():New("ADODB.RecordSet")
CATCH oError
FW_ShowAdoError(oCn)
END
oRsDocfac:CursorLocation := adUseServer
oRsDocfac:LockType := adLockOptimistic
oRsDocfac:CursorType := adOpenKeyset
oRsDocfac:Source := oVar
oRsDocfac:ActiveConnection( oCn )
TRY
oRsDocfac:Open()
CATCH oError
FW_ShowAdoError(oCn)
END
nRegistros := oRsDocfac:RecordCount()
oFic := strfile(hextostr( oRsDocfac:Fields("pp_imagen"):Value ) )
xbrowse()
oRsDocfac:close()
pero ahora no se como mostrar la imagen en pantalla, lo intente en un dialogo de la siguiente manera, pero no sale la imagen.
¿Que estoy haciendo mal?
Code: Select all | Expand
DEFINE BRUSH oFondo FILE ".\res\res_403.BMP"
DEFINE DIALOG oCuadro RESOURCE "orPrueba" ICON "#8001" TRANSPARENT BRUSH oFondo
REDEFINE BUTTONBMP Btn_Limp ID 4003 OF oCuadro BITMAP "Blimpi2" TOOLTIP "Limpiar Filtro"
REDEFINE IMAGE oImg ID 4001 OF oCuadro ADJUST SCROLL
oCuadro:cTitle := "Imagen"
oCuadro:bStart := { || oImg:LoadBmp( oFic ),oImg:Refresh() }
ACTIVATE DIALOG oCuadro NOWAIT CENTERED
De antemano gracias
Re: Imagenes en Postgress
Posted: Wed Apr 22, 2015 3:57 am
by carlos vargas
Code: Select all | Expand
cFotoEmpl := oRS:Fields("FOTO"):Value //aca esta la foto almacenada en hexadecimal
lFotoEmpl := !Empty( cFotoEmpl )
cFotoEmpl := IIf( !lFotoEmpl, FileStr( ".\pictures\nopict.jpg" ), HB_HexToStr( cFotoEmpl ) ) //en caso de no haber foto almacenada en la columna 'FOTO' del recordsource entonce leo de disco una foto con una imagen vacia
...
REDEFINE IMAGE oFotoEmpl ;
ID 116 OF PAGE1 ;
ADJUST
...
ACTIVATE DIALOG oDlgE ON INIT ( oFotoEmpl:LoadFromMemory( cFotoEmpl ) )
....
Code: Select all | Expand
PROCEDURE Empl_AgregarFoto()
LOCAL cArchivo := ""
IF lFotoEmpl
MsgInfo( "Debe quitar primero la foto actual del empleado, para registrar otra.", "Información" )
RETURN
ENDIF
cArchivo := cGetFile( "Archivos grafico | *.JPG", "Seleccionar archivo de foto de empleado", 1, GetFolderMyPictures() )
IF !Empty( cArchivo )
lFotoEmpl := TRUE
cFotoEmpl := FileStr( cArchivo )
oFotoEmpl:LoadFromMemory( cFotoEmpl )
oFotoEmpl:Refresh()
ENDIF
RETURN
PROCEDURE Empl_BorrarFoto()
IF MsgNoYes( "Desea quitar la foto del empleado?" )
lFotoEmpl := FALSE
cFotoEmpl := FileStr( ".\pictures\nopict.jpg" ) // aca muestro una imagen para los casos de foto vacia
oFotoEmpl:LoadFromMemory( cFotoEmpl )
oFotoEmpl:Refresh()
ENDIF
RETURN

Re: Imagenes en Postgress
Posted: Wed Apr 22, 2015 6:52 pm
by leandro
Carlos muchas gracias por responder...
Ya realice los cambios que tu me sugeriste pero aun así, no me muestra la imagen.
Que me hace falta?
Code: Select all | Expand
msginfo("creamos el recorset")
oVar := "SELECT * from lyma_imagen WHERE pp_itemga=1"
msginfo(oVar)
TRY
oRsDocfac:=tOleAuto():New("ADODB.RecordSet")
CATCH oError
FW_ShowAdoError(oCn)
END
oRsDocfac:CursorLocation := adUseServer
oRsDocfac:LockType := adLockOptimistic
oRsDocfac:CursorType := adOpenKeyset
oRsDocfac:Source := oVar
oRsDocfac:ActiveConnection( oCn )
TRY
oRsDocfac:Open()
CATCH oError
FW_ShowAdoError(oCn)
END
nRegistros := oRsDocfac:RecordCount()
msginfo(nRegistros)
cFotoEmpl := oRsDocfac:Fields("pp_imagen"):Value //aca esta la foto almacenada en hexadecimal
lFotoEmpl := !Empty( cFotoEmpl )
cFotoEmpl := IIf( !lFotoEmpl, FileStr( ".\pictures\nopict.jpg" ), HexToStr( cFotoEmpl ) ) //en caso de no haber foto almacenada en la columna 'FOTO' del recordsource entonce leo de disco una foto con una imagen vacia
oRsDocfac:close()
oCn:Close()
DEFINE BRUSH oFondo FILE ".\res\res_403.BMP"
DEFINE DIALOG oCuadro RESOURCE "orPrueba" ICON "#8001" TRANSPARENT BRUSH oFondo
REDEFINE BUTTONBMP Btn_Limp ID 4003 OF oCuadro BITMAP "Blimpi2" TOOLTIP "Limpiar Filtro"
REDEFINE IMAGE oFotoEmpl ID 4001 OF oCuadro ADJUST
oCuadro:cTitle := "Tabla de Proyectos"
ACTIVATE DIALOG oCuadro NOWAIT ON INIT ( oFotoEmpl:LoadFromMemory( cFotoEmpl ) )
Cuando no hay imagen y el campo esta empty() si muestra la imagen que esta en disco.
Creo que no muestra la imagen por que no es una imagen
coloque un msginfo(valtype(cFotoEmpl)) y me arroja "C"

Re: Imagenes en Postgress
Posted: Wed Apr 22, 2015 8:40 pm
by leandro
Listo solucionado

.... el código quedo de la siguiente manera:
La tabla la cree de la siguiente manera:
Code: Select all | Expand
*---------------------> 42 <----------------------------*
cQuery := "CREATE TABLE IF NOT EXISTS lyma_imagen "
cQuery += "("
cQuery += "pp_itemga serial NOT NULL,"
cQuery += "pp_rutass VARCHAR(200) NULL ,"
cQuery += "pp_imagen text NULL,"
cQuery += " PRIMARY KEY (pp_itemga)"
cQuery += ") "
TRY
oLamcla:oCon:Execute(cQuery)
CATCH oError
FW_ShowAdoError(oLamcla:oCon)
END
//oProgress:nPosition += 1
sysrefresh()
El siguiente codigo sube una imagen a una tabla en postgres y luego la descarga y la muestra.
Code: Select all | Expand
#include "FiveWin.Ch"
#include "xbrowse.ch"
#include "adodef.ch"
postgresimages()
function postgresimages()
local oCn, oRs, cSql, a
local cPath := "c:\fwh1501\bitmaps\backgrnd\"
local cPassWord := "lyma"
TRY
oCn := CreateObject( "ADODB.Connection" )
oCn:ConnectionString := "DSN=finca_raiz;Uid=postgres;Pwd=123456;"
oCn:Open()
CATCH oError
FW_ShowAdoError(oCn)
END
cFileStr := strtohex( "c:\fwh1501\bitmaps\jpg\lote.jpeg" )
cSql:="INSERT INTO lyma_imagen (pp_rutass,pp_imagen) VALUES ('"+alltrim("c:\fwh1501\bitmaps\jpg\lote2.jpeg")+"','"+cFileStr+"')"
TRY
oCn:Execute( cSql )
CATCH oError
FW_ShowAdoError(oCn)
END
oVar := "SELECT * from lyma_imagen WHERE pp_itemga=4"
TRY
oRsDocfac:=tOleAuto():New("ADODB.RecordSet")
CATCH oError
FW_ShowAdoError(oCn)
END
oRsDocfac:CursorLocation := adUseServer
oRsDocfac:LockType := adLockOptimistic
oRsDocfac:CursorType := adOpenKeyset
oRsDocfac:Source := oVar
oRsDocfac:ActiveConnection( oCn )
TRY
oRsDocfac:Open()
CATCH oError
FW_ShowAdoError(oCn)
END
nRegistros := oRsDocfac:RecordCount()
cFotoEmpl := oRsDocfac:Fields("pp_imagen"):Value //aca esta la foto almacenada en hexadecimal
lFotoEmpl := !Empty( cFotoEmpl )
cFotoEmpl := IIf( !lFotoEmpl, FileStr( ".\pictures\nopictu.jpg" ), HexToStr( cFotoEmpl ) ) //en caso de no haber foto almacenada en la columna 'FOTO' del recordsource entonce leo de disco una foto con una imagen vacia
oRsDocfac:close()
oCn:Close()
DEFINE BRUSH oFondo FILE ".\res\res_403.BMP"
DEFINE DIALOG oCuadro RESOURCE "orPrueba" ICON "#8001" TRANSPARENT BRUSH oFondo
REDEFINE BUTTONBMP Btn_Limp ID 4003 OF oCuadro BITMAP "Blimpi2" TOOLTIP "Limpiar Filtro"
REDEFINE IMAGE oFotoEmpl ID 4001 OF oCuadro ADJUST
oCuadro:cTitle := "Tabla de Proyectos"
ACTIVATE DIALOG oCuadro NOWAIT ON INIT ( oFotoEmpl:LoadBmp( cFotoEmpl ) )
Muchas gracias a todos por las respuestas
Re: Imagenes en Postgress - SOLUCIONADO
Posted: Thu Apr 23, 2015 4:09 pm
by Francisco Horta
Una pequeña consulta,
He probado el codigo, funciona bien, pero me salta la duda:
Me guarda la ruta del archivo, no la imagen.
al menos eso me paso. me guarda "2E5C446F63756D656E746F735C747265732E6A7067" en mi tabla en mi campo nombre tipo TEXT,
hice esta prueba,
1. en el directorio donde tengo la imagen "prueba.jpg" la guarde en la tabla.
2. renombre la imagen de "prueba.jpg" a "pprueba.jpg".
3. cargo la imagen del campo de mi tabla.
y no me carga la imagen, veo el dato extraido y es la ruta.
entonces mi conclusion es que me almacena la ruta de la imagen, mas no la imagen. es esto correcto?
Saludos