Imagenes en Postgress - SOLUCIONADO

User avatar
leandro
Posts: 1771
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 13 times
Contact:

Imagenes en Postgress - SOLUCIONADO

Post 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
Last edited by leandro on Wed Apr 22, 2015 10:59 pm, edited 1 time in total.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
carlos vargas
Posts: 1723
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Imagenes en Postgress

Post 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
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
nageswaragunupudi
Posts: 10733
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 11 times
Contact:

Re: Imagenes en Postgress

Post 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.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10733
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 11 times
Contact:

Re: Imagenes en Postgress

Post 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?
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10733
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 11 times
Contact:

Re: Imagenes en Postgress

Post 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
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10733
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 11 times
Contact:

Re: Imagenes en Postgress

Post 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 )
 
Regards

G. N. Rao.
Hyderabad, India
User avatar
leandro
Posts: 1771
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 13 times
Contact:

Re: Imagenes en Postgress

Post 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.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
carlos vargas
Posts: 1723
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Imagenes en Postgress

Post by carlos vargas »

esto lo he probado en mysql y mssql con campos de tipo text.

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
leandro
Posts: 1771
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 13 times
Contact:

Re: Imagenes en Postgress

Post 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

Code: Select all | Expand


PostgreSQL 9.4 (x86)
 


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()
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
nageswaragunupudi
Posts: 10733
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 11 times
Contact:

Re: Imagenes en Postgress

Post by nageswaragunupudi »

HB_STRTOHEX in Harbour is same as STRTOHEX in xHarbour.
If you are using, you may use STRTOHEX instead of HB_STRTOHEX.
Regards

G. N. Rao.
Hyderabad, India
User avatar
leandro
Posts: 1771
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 13 times
Contact:

Re: Imagenes en Postgress

Post 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
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
carlos vargas
Posts: 1723
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Imagenes en Postgress

Post 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
 

Image
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
leandro
Posts: 1771
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 13 times
Contact:

Re: Imagenes en Postgress

Post 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"

Image
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
leandro
Posts: 1771
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 13 times
Contact:

Re: Imagenes en Postgress

Post by leandro »

Listo solucionado :D .... 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
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Imagenes en Postgress - SOLUCIONADO

Post 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
____________________
Paco
Post Reply