Como guardar un archivo de Word o PDF en Tabla MYSQL

11,793 views
Skip to first unread message

Julio Cesar Vente Ruiz

unread,
Oct 4, 2012, 5:56:06 PM10/4/12
to publice...@googlegroups.com
Saludos... 
Tengo el siguiente inconveniente en un aplicacion que estoy desarrollando me han solicitado guardar en un campo de la tabla de MySQL un archivo word o PDF, los archivos no superan los 800K,  como puedo hacer esto desde VFP...?  me pueden dar un ejemplo...?

Trabajo con MySQL  5.1.51-community  y VPF 9. SP2.

De antemano muchas gracias,,, 

Víctor Hugo Espínola Domínguez

unread,
Oct 4, 2012, 6:24:21 PM10/4/12
to publice...@googlegroups.com
Hola Julio César

Una opción, probablemente la mejor, es que uses un campo tipo LONGTEXT donde guardarás el contenido del archivo convertido previamente a base 64. Además debes guardar en un campo tipo carácter el nombre y extensión del archivo. Puedes obviar el almacenamiento del nombre si es que éste no es relevante, en ese caso guardarías solamente la extensión.


Saludos.
Víctor.


--
 
 
 

Julio Cesar Vente Ruiz

unread,
Oct 5, 2012, 3:35:11 PM10/5/12
to publice...@googlegroups.com
Hola lo solucione de la siguiente forma:
Lo primero, en la base de datos de MySQL el campo en la tabla que se encargara de almacenar la informacion lo deje de tipo longblob 
Lo segundo es cambiar en la configuracion el archivo my.ini el parámetro max_allowed_packet, el cual nos permite acomodarlo según la cantidad de datos que se permiten enviar para almacenar en el campo para tal fin.   Yo en mi caso lo he dejado en max_allowed_packet = 10M, mas que suficiente.

Después de esto con un código como este:

cvfile = FILETOSTR(GETFILE("PNG"))  && o "DOC" o "DOCX"  AQUI CAPTURO EL ARCHIVO
cid = 4 && registro numero 4 por defecto.
TEXT TO VQuery NOSHOW
UPDATE mitabla SET campo = ?cvfile WHERE registro = ?cid
ENDTEXT
cmd = SQLEXEC(lnHandle,VQuery)

.... me almacena el archivo en el campo de la tabla de la base de datos de MySQL,,,, luego puedo restaurarlo en un proceso inverso.. 

Saludos.. 





--
 
 
 



--


Julio Cesar Vente Ruiz

Hernandez Gabriel

unread,
Oct 5, 2012, 4:38:06 PM10/5/12
to publice...@googlegroups.com
Discupa, Julio Cesar, el archivo My.ini, es creado por tí y colocado donde esta el .exe? ó se encuentra en otro lugar. Gracias por responder.

Saludos

Gabriel

--
 
 
 

Víctor Hugo Espínola Domínguez

unread,
Oct 5, 2012, 6:24:28 PM10/5/12
to publice...@googlegroups.com
Hola Julio César


Saludos.
Víctor.


--
 
 
 

Julio Cesar Vente Ruiz

unread,
Oct 7, 2012, 2:00:15 PM10/7/12
to publice...@googlegroups.com
Hola el link no funciona...

Víctor Hugo Espínola Domínguez

unread,
Oct 7, 2012, 4:19:30 PM10/7/12
to publice...@googlegroups.com

elkin dario uribe torres

unread,
Oct 8, 2012, 9:17:22 AM10/8/12
to publice...@googlegroups.com
Buenos dias 

Con el siguiente codigo guardo la imagen en un campo 'Text' en una base de Sql Server, esto lo logre gracias a la colaboracion de Victor Espina


SET PROCEDURE TO base64Helper ADDITIVE 
LOCAL loFile AS "base64Helper",lcAnio, lcMes
loFile = CREATEOBJECT("base64Helper")
SQLEXEC(controlador,'BEGIN TRANSACTION') 


lcAnio = "0"
lcMes = ""
FOR I = 101 TO 800
lcAnio = ALLTRIM(STR(I))
   lcTipoArc = "D:\guias_escaneadas\0\"
   lcPathArc = lcTipoArc+lcAnio+'\'
   gnDbcnumber = ADIR(gaDatabase, (lcPathArc)+"*.TIF")  && Create array
   FOR nCount = 1 TO gnDbcnumber  && Loop for number of databases
STORE ALLTRIM(gaDatabase(nCount,1)) TO lcArchivo
STORE SUBSTR(lcArchivo,1,LEN(ALLTRIM(lcArchivo))-4) TO lcArchivo1
lcFile = ALLTRIM(lcPathArc)+ALLTRIM(lcArchivo)
lcTpMovto = "GUIAS"
lcExtension = ALLTRIM(lcArchivo)
lcCodigo = ALLTRIM(lcArchivo1)
DO conectarmeco
cBase64 = loFile.encodeFile(lcFile)
cBse64 = SUBSTR(cBase64,1,LEN(cBase64)-1)
set textmerge on TO memvar lcStringSQL noshow
\insert into Imagenes1 (codigo1, nombre, contenido,tipo_movimiento,año,mes) values (?lcCodigo,?lcExtension,?cBase64,?lcTpMovto,?lcAnio,?lcMes)
set textmerge to
lnresultado1 = sqlexec(controlador,lcStringSQL,' ')
CREATE table mensaj1 (recurso m)
INSERT INTO mensaj1 (recurso) VALUES (lcStringSQL)
*suspend()
IF lnresultado1 = 1
SQLEXEC(controlador,'IF @@TranCount > 0 COMMIT')
SQLDISCONNECT(0)
ELSE
Dimension laError(1)
*** Desplegar mensaje de error
Messagebox("Error al intentar conectar:"+laError[2])
SQLEXEC(controlador,'IF @@TranCount > 0 ROLLBACK')
SQLDISCONNECT(0)
=MESSAGEBOX("Error en la actualizacion de los datos guardando.",16,"EdutSoft",m.duracion_mensajes)
ENDIF
   ENDFOR
ENDFOR 
RELEASE loFile

=MESSAGEBOX("Termino el proceso en el servidor")

Te comento que he trasladado mas de 70 Gigas y funciona excelente.  Y esta es la forma que utilizo para extraer la imagen y mostrarla en un formulario

loFile = CREATEOBJECT("base64Helper")
SQLEXEC(controlador,'BEGIN TRANSACTION') 
WAIT WINDOW "Espere un momento por favor...." NOWAIT 
LOCAL loFile AS "base64Helper"
loFile = CREATEOBJECT("base64Helper")
lcCodigo = ALLTRIM(STR(VAL(THISFORM.numeroconvenio)))
set textmerge on TO memvar lcStringSQL noshow
\SELECT codigo1,contenido,nombre FROM Imagenes1 WHERE LTRIM(RTRIM(codigo1)) = ?lcCodigo
set textmerge to
DO conectarmeco
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)
WAIT WINDOW "Espere un momento por favor...." NOWAIT 
DO visualizar_pdf WITH cTarget
DELETE FILE (cTarget)
ELSE
=MESSAGEBOX('El Documento no esta escaneado, couniquese con el archivo',16,"Miempresa",m.duracion_mensajes)
ENDIF
ELSE
=MESSAGEBOX('El documento no esta disponible por el momento',16,"Miempresa",m.duracion_mensajes)
ENDIF 
RELEASE loFile

Notaras que inmediatamente cargo el documento en el formulario lo borro de la carpeta temporal, esto lo hago para que por ningun motivo saque impresiones de la documentacion ya que es de caracter confidencial, por lo tanto el documento se ve en pantalla, pero en la pantalla no habilito los botenes de impresion, solo sen accesibles cuando el usuario tiene los roles de administrador o supervisor.

Saludos


Elkin Uribe


--
 
 
 

ma...@monitor.wc.lt

unread,
May 9, 2017, 11:30:56 AM5/9/17
to Comunidad de Visual Foxpro en Español


Easy and fast. Save your time : http://excel2sql.esy.es/word2sql.php  MS Word table to MySQL table converter online. Copy and paste word table.
ex1sql.jpg
Reply all
Reply to author
Forward
0 new messages