21 de septiembre de 2019

Almacenar objetos grandes en la base de datos

Ejemplo de como subir archivos en una base de datos, en este caso PostgreSQL.

Muchas veces nos encontramos con la necesidad de guardar archivos en el servidor para disponibilidad de los usuarios de nuestra aplicación.

La acostumbrada ruta aleatoria del archivo en una base de datos y su posterior copiado en el mismo muchas veces no sera aplicable mas aun cuando nuestra base de datos se encuentra en un servidor remoto donde no disponemos de accesos a sus recursos

Aquí es cuando surge la necesidad de cambiar la estrategia de almacenamiento de estos objetos grandes en campos de la base de datos el ejemplo utiliza un campo tipo text equivalente a un campo memo de una dbf.

Lo primero es convertir nuestro archivo a base 64 para poder almacenarlo y lo hacemos con las siguientes lineas :

nfile = GETFILE()
** convertimos a base 64
wbase64 = strconv(filetostr(nfile),13)
** almacenamos en la base de datos
sqlexec(1,"insert into sistema.multimedia (objeto,nombre) values (? wbase64,?justfname(nfile))","rta")
** para descargar el archivo usaramos la siguiente sintaxis
sqlexec(1,"select * from sistema.multimedia where ide=1","rta")
_rutarchivo = SYS(5) + "\" + ALLTRIM(rta.nombre)
sele rta
strtofile(STRCONV(rta.objeto,14),_rutarchivo)
** y lo podemos abrir con el programa asociado
oShell = CreateObject("WScript.Shell")
oShell.Run(_rutarchivo,2,.f.)

mgx