Saludos estimados,
Necesito grabar una imagen .PNG en un campo de una tabla MySql y luego recuperarla para mostrarla.
Quien me da alguna orientaci贸n?
Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin
Carora, Estado Lara, Venezuela.
Saludos estimados,
Necesito grabar una imagen .PNG en un campo de una tabla MySql y luego recuperarla para mostrarla.
Quien me da alguna orientaci贸n?
Yo guardo archivos de todo tipo en mysql como binarios en campos del tipo "long text"
Primero se debe configurar Mysql para que lo permita
Desde el administrador de Mysql entras en Startup variables
Debes entrar en modo localhost y ejecutar como administrador
vas a la ceja Advanced Networking
en el apartado Data / Memory Size
le cambias a Max Packed size (yo le puse 16M)
Para subir un archivo cualquiera
FUNCTION GUARDADIR(cFILE,cTIPO)
APROG :=DIRECTORY(cFILE)
PUBLIC PROGNOM:=APROG[1,1]
PUBLIC PROGTAM:=APROG[1,2]
PUBLIC PROGFEC:=APROG[1,3]
PUBLIC PROGHRS:=APROG[1,4]
*
cFileG := StrToHex(MemoRead(cFILE))
*
cCMDVAL :=""
cCmdSql := "INSERT INTO PROGRAMA(TIPO,ARCHIVO,NOMBRE,FECHA,TAMA,HORA) VALUES( "
cCMDVAL := cCMDVAL+"'"+cTIPO +"', "
cCMDVAL := cCMDVAL+"'"+cFileG +"', "
cCMDVAL := cCMDVAL+"'"+cFILE +"', "
cCMDVAL := cCMDVAL+"'"+DToS(PROGFEC)+"',"
cCMDVAL := cCMDVAL+"'"+Str(PROGTAM) +"',"
cCMDVAL := cCMDVAL+"'"+PROGHRS+"' );"
IF !EJECUTA(cCmdSql+cCMDVAL)
MsgStop("ERROR AL GRABAR ARCHIVO "+cFILE ,"AVISO")
RETURN(.F.)
ENDIF
RETURN(.T.)
PARA RECUPERAR
FUNCTION EDATOS(cDAT,cNOM)
cARCH=HexToStr(cDAT)
ASALIDA:=".\"+cNOM
hFile := FCreate(asalida)
FWrite( hFile, cARCH)
FClose( hFile )
RETURN NIL
If lModImg
Function GrabarFoto(cLogo) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// ruta completa de la imagen
聽 聽 cChr := StrToHex(MemoRead( cLogo ) ) 聽 聽 聽 聽 // tiene que estar en archivo
聽 聽 oCn:Update( "general", {"logotipo"}, {cChr}, "registro = " + cReg ) 聽 // guardar en MEDIUMBLOB
EndIf
Return(NIl)Function LeerLogotipo(oCn, oImagen, lBmp)
local cDat, oDat, cIMg, cFilRt, nHnd, oImg
DEFAULT lBmp := .f.
cDat := "SELECT logotipo FROM general LIMIT 1"
oDat := SQLQry(oCn, oDat, cDat)
If EMPTY(oDat:logotipo)
聽 聽Return(oImagen)
EndIf
oImg := oDat:logotipo
IF !EMPTY(oImg)
聽 TRY
聽 聽 cImg := HexToStr(oImg)
聽 CATCH
聽 聽 Return(oImagen)
聽 END
聽 If !lBmp
聽 聽 聽oImagen:SetSource(cImg)
聽 聽 Else
聽 聽 聽oImagen:LoadImage(cImg)
聽 Endif
EndIf
Return(oImagen)cRutaFoto := "c:\miruta\imagen.png"
rutaTXT := "c:\miruta\imagen.txt"
fMimeEnc( cRutaFoto, rutaTXT ) //Convertimos la imagen o cualquier archivo, en texto base64
cText := MemoRead( rutaTXT ) //Recuperamos el texto
cText := STRTRAN(cText,CRLF,'') 聽//Lo limpiamos
y con esta variable cText a la base de datos en un campo de tipo MEDIUMTEXTcVar:=聽 "SELECT * FROM tabla WHERE campo=variable"
oRs := FW_OPENRECORDSET(oCn,cVar,adLockOptimistic,adOpenKeyset)
if oRs:RecordCount()#0
聽 聽 uArch := hb_base64decode( oRs:Fields("campo"):Value )
聽 聽 oFto:SetSource( uArch ) //Aqui la asigamos al objeto ximage, pero la puedes colocar si quieres en el disco duro
聽 聽 oFto:refresh()
else
聽 聽 oFto:SetSource( cRutaNoF )
聽 聽 oFto:refresh()
endif
oRs:close()Estimados amigos.
Saludos a todos,
Muchas gracias a quienes me sugirieron ideas a mi pregunta.
Despu茅s de verlas todas, me decant茅 por la opci贸n de leandro, que me pareci贸 la mas sencilla. Despu茅s de adaptarla a mi sistema, qued贸 muy bien.
Ciertamente, he leido en internet diversas opiniones y todas apuntan a que lo mejor es guardar las im谩genes en carpetas de disco, bien sea en la nube o localmente.
Se dice de que guardarlas en tablas finalmente termina generando problemas, aunque no especifican que tipo de problemas.
Esperar茅 a ver como se comporta y el feed back del cliente,
Una vez m谩s, muchas gracias a todos.!