Leyendo todo el hilo, recuerdo que en su tiempo por el 2010 se hablo sobre el mismo tema y las recomendaciones que dieron fue guardar las imagenes en la base de datos y lo hice para las dos opciones por la razon de que en ese momento la informacion se almacenaba en el motor de VFP y este tiene un tamaño limitado para lo que se pretendia. Por lo tanto la solucion que encontre que no se si es la mejor pero me funciona es:
- Se guardan las imagenes en una carpeta y esta se subdivide en carpetas que cada una lo maximo que guarde son 1.000 archivos por cuestiones de limitacion del windows. Ya que al almacenar mas imagenes de esta se vuelve demasiado elnto el sistema operativo al tratar de ver la carpeta por el explorador de windows (NTFS). (Opcion Vfp)
- La carpeta del servidor donde se encuentran las imagenes estan definidas en un archivo .ini con la siguientes instrucciones (Opcion VFP)
- Al momento de ingresar a la aplicacion (cada exe existe en cada estacion) este va y lee el archivo INI y los valores los almacena en propiedades o variables publicas.
- Se determina que tipo de motor se va a utilizar ("VFPDatabase" o "SqlDatabase")
Cada que quiero cargar una imagen esta los hago cargando la ruta almacenada en la variables/propiedades con el siguiente codigo. (Opcion VFP)
PRIVATE lcArchivo
STORE INT(VAL(cartas1.consecutiv)/1000000) TO lccreardir1
STORE INT((VAL(cartas1.consecutiv)/1000000)*1000) TO lccreardir2
STORE gcGuias+"\"+ALLTRIM(STR(lccreardir1))+"\"+ALLTRIM(STR(lccreardir2)) TO Lcdir
lcFile = (Lcdir)+"\"+ALLTRIM((cartas1.Consecutiv))+".tif"
STORE "TIF" TO lcExtension
IF tipoconexion = "VFPDatabase"
IF FILE(lcFile)
DO FORM ver_tif WITH lcFile, "Guia No.",ALLTRIM((cartas1.Consecutiv))
ELSE
IF !EMPTY(thisform.vfpskin1.cskinname)
thisform.vfpskin1.skinmessagebox('La Guia no esta disponible por el momento',16,"Empresa",m.duracion_mensajes)
ELSE
=MESSAGEBOX('La Guia no esta disponible por el momento',16,"Empresa",m.duracion_mensajes)
ENDIF
ENDIF
ELSE
LOCAL loFile AS "base64Helper"
loFile = CREATEOBJECT("base64Helper")
lcCodigo = ALLTRIM(cartas1.Consecutiv)
set textmerge on TO memvar lcStringSQL noshow
\SELECT codigo1,contenido,nombre, tipo_movimiento FROM Imagenes1 WHERE LTRIM(RTRIM(codigo1)) = ?lcCodigo and LTRIM(RTRIM(tipo_movimiento)) = 'GUIAS'
set textmerge to
DO conectarSql
STORE sqlexec(controlador,lcStringSQL,'QARCHIVO') TO a
sqldisconnect(0)
IF a > 0
IF !EMPTY(QARCHIVO.contenido)
LOCAL cTarget,cBase64
cTarget = "C:\temp\" + RTRIM(QARCHIVO.nombre)
cBase64 = RTRIM(QARCHIVO.contenido)
loFile.decodeFile(cBase64, cTarget)
DO FORM ver_tif WITH cTarget, "Guia No.",ALLTRIM((cartas1.Consecutiv)) TO respuesta
IF respuesta = .T.
DELETE FILE (cTarget)
ENDIF
ELSE
IF !EMPTY(thisform.vfpskin1.cskinname)
thisform.vfpskin1.skinmessagebox('La Guia no esta disponible por el momento',16,"Empresa",m.duracion_mensajes)
ELSE
=MESSAGEBOX('La Guia no esta disponible por el momento',16,"Empresa",m.duracion_mensajes)
ENDIF
ENDIF
ELSE
IF !EMPTY(thisform.vfpskin1.cskinname)
thisform.vfpskin1.skinmessagebox('La Guia no esta disponible por el momento',16,"Empresa",m.duracion_mensajes)
ELSE
=MESSAGEBOX('La Guia no esta disponible por el momento',16,"Empresa",m.duracion_mensajes)
ENDIF
ENDIF
RELEASE loFile
ENDIF
Espero que se entienda un poco lo expuesto, en lo que se refiere al almacenamiento en la base de datos todo el codigo que utilizo para almacenar y ver la imagen es del maestro VICTOR ESPINA.
La imagen la llevo a un archivo temporal, permito que se pueda visualizar y por cuestiones de seguridad pueden ver que la imagen se borra, no se almacena.