Imagenes en Postgress - SOLUCIONADO

Imagenes en Postgress - SOLUCIONADO

Postby leandro » Fri Apr 17, 2015 4:27 pm

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 view  RUN

#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 view  RUN

   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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Imagenes en Postgress

Postby carlos vargas » Sun Apr 19, 2015 3:11 am

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 view  RUN
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
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Imagenes en Postgress

Postby nageswaragunupudi » Mon Apr 20, 2015 1:10 pm

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 view  RUN
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: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Imagenes en Postgress

Postby nageswaragunupudi » Mon Apr 20, 2015 1:13 pm

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: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Imagenes en Postgress

Postby nageswaragunupudi » Mon Apr 20, 2015 1:46 pm

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: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Imagenes en Postgress

Postby nageswaragunupudi » Mon Apr 20, 2015 2:42 pm

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 view  RUN

  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
nageswaragunupudi
 
Posts: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Imagenes en Postgress

Postby leandro » Mon Apr 20, 2015 3:46 pm

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Imagenes en Postgress

Postby carlos vargas » Mon Apr 20, 2015 4:43 pm

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
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Imagenes en Postgress

Postby leandro » Mon Apr 20, 2015 7:19 pm

Carlos Buenas tardes... Intente de la forma que me sugeriste pero al compilar me arroja los siguientes errores:

Code: Select all  Expand view  RUN

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 view  RUN

PostgreSQL 9.4 (x86)
 


La tabla la creo de la siguiente manera:
Code: Select all  Expand view  RUN

*---------------------> 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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Imagenes en Postgress

Postby nageswaragunupudi » Mon Apr 20, 2015 7:28 pm

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
nageswaragunupudi
 
Posts: 10690
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Imagenes en Postgress

Postby leandro » Tue Apr 21, 2015 5:02 pm

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 view  RUN

   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 view  RUN

   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 view  RUN

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Imagenes en Postgress

Postby carlos vargas » Wed Apr 22, 2015 3:57 am

Code: Select all  Expand view  RUN

      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 view  RUN

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
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Imagenes en Postgress

Postby leandro » Wed Apr 22, 2015 6:52 pm

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 view  RUN

   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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Imagenes en Postgress

Postby leandro » Wed Apr 22, 2015 8:40 pm

Listo solucionado :D .... el código quedo de la siguiente manera:

La tabla la cree de la siguiente manera:
Code: Select all  Expand view  RUN

*---------------------> 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 view  RUN

#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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Imagenes en Postgress - SOLUCIONADO

Postby Francisco Horta » Thu Apr 23, 2015 4:09 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 22 guests