Usar FTP

422 views
Skip to first unread message

Kike. Sevilla

unread,
Oct 11, 2014, 6:15:43 AM10/11/14
to publice...@googlegroups.com
Hola Grupo:
¿Alguien puede indicarme qué módulo, clase o lo que sea que usan para enviar/rescatar ficheros por ftp?

Tengo una aplicación y necesito enviar y recibir ficheros a una dirección de internet por ftp pero no tengo nada con qué hacerlo.

Muchas gracias por la ayuda.

Saludos cordiales.

Kike.
Sevilla - España.

Florencio Beltran de Heredia

unread,
Oct 11, 2014, 7:54:58 AM10/11/14
to publice...@googlegroups.com
Kike:

Mira este enlace. Esta librería funciona muy bien y está perfectamente documentada. Hay otras librerías para VFP, pero esta funciona de maravilla.


Saludos

Florencio Beltran de Heredia.
Vitoria. España

José Enrique Llopis

unread,
Oct 11, 2014, 8:59:27 AM10/11/14
to publice...@googlegroups.com

Yo uso estas:  http://www.chilkatsoft.com/

 

Tengo un programa para inmobiliarias y el problema es que cuando se hacen publicaciones en portales Web se manda mucha información y tarda bastante, las librerías basadas en Wininet iban bien pero a veces Internet no funciona como debiera y simplemente dejaban colgado todo.

 

De todas las que he probado estas, en el entorno que comento, son de las más fiables, pero eso si, son de paga.

 

Pepe Llopis

 

 


Daniel Del Giudice

unread,
Oct 12, 2014, 8:13:37 PM10/12/14
to publice...@googlegroups.com

Yo uso esto, no falla nunca, es parte de Windows, no se necesita instalar nada:

DECLARE LONG InternetOpen IN "wininet.dll" STRING, LONG, STRING, STRING, LONG
DECLARE LONG InternetConnect IN "wininet.dll" LONG, STRING, LONG, STRING, STRING, LONG, LONG, LONG
DECLARE INTEGER FtpSetCurrentDirectory IN WinINet.DLL INTEGER, STRING
DECLARE INTEGER FtpGetFileSize IN wininet INTEGER, LONG @
DECLARE LONG FtpOpenFile IN "wininet.dll" LONG, STRING, INTEGER, INTEGER, INTEGER
DECLARE LONG InternetReadFile IN "wininet.dll" LONG, STRING @, LONG, LONG @
DECLARE INTEGER InternetWriteFile IN WinINet.DLL INTEGER, STRING, INTEGER, INTEGER @
DECLARE INTEGER InternetCloseHandle IN "wininet.dll" LONG


if ftpsetcurrentdirectory(oo.ftp, '/'+oo.directorio_remoto)=0
  thisform.mensaje.caption = "¡No se encontró directorio destino!"
  =inkey(1.5,"H")
  return .f.
endif

lnremote = ftpopenfile(oo.ftp, oo.archivo_remoto, 1073741824, 2, 0)
if lnremote=0
  thisform.mensaje.caption = "¡No se pudo crear archivo remoto!"
  =inkey(1.5,"H")
  return .f.
endif

lnlocal = fopen(oo.archivo_local)
if lnlocal=-1
  thisform.mensaje.caption = "¡No se pudo abrir archivo local!"
  internetclosehandle(lnremote)
  =inkey(1.5,"H")
  return .f.
endif

lnbuffersize = 1024
lnfilelength = fseek(lnlocal, 0, 2)
fseek(lnlocal, 0, 0)
lnuploaded = 0
do while lnuploaded<lnfilelength
  lcbuffer = fread(lnlocal, lnbuffersize)
  lnwritten = 0
  internetwritefile(lnremote, lcbuffer, len(lcbuffer), @lnwritten)
  lnuploaded = lnuploaded+len(lcbuffer)
  thisform.mensaje.caption = "Enviando datos: "+ltrim(str(lnuploaded*100/lnfilelength))+"%"
enddo
internetclosehandle(lnremote)
fclose(lnlocal)

Es sólo un ejemplo de enviar un archivo.

Saludos,

Daniel Del Giudice
Santiago del Estero
Argentina

José Enrique Llopis

unread,
Oct 13, 2014, 2:10:49 AM10/13/14
to publice...@googlegroups.com

Siento no estar de acuerdo con lo de que nunca falla, si mandas ficheros pequeñitos va de lujo pero si haces un envío de, digamos, cincuenta o cien megas al servidor, tienes muchas posibilidades de quedarte colgado cualquier día.

 

Como siempre todo en la vida son compromisos.

 

 

Pepe Llopis

 


Daniel Del Giudice

unread,
Oct 13, 2014, 10:19:23 AM10/13/14
to publice...@googlegroups.com
Hola Pepe,

perdón, no había leído tu correo entero, sólo hasta donde decías que usabas el soft de chilkatsoft. Realmente mis clientes no deben pasar más de 5 o 10 megas de información, así que no tengo la experiencia con archivos muy grandes, aunque pienso que si el internet no anda bien y se corta, el proceso no va a terminar, no importa el tamaño del archivo. En ese entorno de cortes, claro está, tiene más posibilidades de "pasar" un archivo pequeño, justo en la ventana de tiempo donde internet no se corta, pero ¿quién quiere trabajar así? Me gustaría saber si lo que vos usas se recupera de un corte de internet para luego continuar. Si vos te fijas en mi rutina divido el archivo a enviar en pedazos de 1k y luego envío cada pedazo por separado. Esto lo hago con el fin de mostrar la barra de progreso, pero se podría ir preguntando si cada pedazo de archivo pasó correctamente y si no reenviarlo.

Saludos,

Daniel Del Giudice
Santiago del Estero
Argentina

Rafael Mellado

unread,
Oct 13, 2014, 1:58:24 PM10/13/14
to publice...@googlegroups.com
Hola Kike,

En ficheros pequeños utilizo la librería de  FTP Services for Visual Foxpro 5.0+ de Robert Abram 
En ficheros más grandes entre 1MB - 80MB utilizando el comando FTP del MS-Dos el resultado para mi es satisfactorio, ficheros más grandes de 80MB no lo he probado.


Por ejemplo en un fichero bat ms.dos introduzco:

cls
ftp -s:ftp1.txt


en el fichero ftp1.txt intoduzco:

user miusuario
miclave

hash
binary
cd html
cd setups
send Mifichero


Sl2


El sábado, 11 de octubre de 2014 12:15:43 UTC+2, Kike. Sevilla escribió:

Rene Jara

unread,
Oct 15, 2014, 2:34:50 PM10/15/14
to publice...@googlegroups.com
Hola Daniel
 
el programa que tu dejaste aqui, no lo he podido hacer funcionar
me falta saber como alimentar estas variables
oo.ftp
oo.directorio_remoto
oo.archivo_remoto
oo.archivo_local
 
Lo que basicamente necesito es descargar un archivo de 10mb desde un sitio FTP
lo que aqui se a entregado, no lo he podido hacer que funcione,  el problema que me he dado cuenta
que no son capaces de descargar archivos grande, he dividido pero igual no funcionan
quiero hacer funcionar tu programa para ver si puede bajar archivos grandes,
si me puedes ayuda, te lo agradeceria
 


Saludos,

 
Cordialmente
Rene Jara Muñoz

 

Daniel Del Giudice

unread,
Oct 15, 2014, 4:43:38 PM10/15/14
to publice...@googlegroups.com
Es que dije que era sólo un ejemplo, no un código funcional para copiar y pegar. Era una forma que veas cómo trabaja lo que yo uso.

oo.directorio_remoto es el directorio en el servidor donde se copian los archivos. Crea uno en tu servidor en línea.
oo.archivo_remoto es el nombre que va a tener tu archivo en el servidor en línea, puede diferir del nombre local en la computadora, que es oo.archivo_local.
oo.ftp es el número de conexión que recibes cuando te conectas al servidor remoto y que hace referencia para cualquier operación posterior.

Te paso ciertas rutinas para que se te aclare el panorama. Estoy casi seguro que las bajé de Portal Fox, pero ya no recuerdo y no mantuve los créditos dentro de mi sistema. Necesitas reemplazar mis variables con tus datos del servidor, usuario y contraseña. Nada más.

* Load
oo = CREATEOBJECT("empty")
ADDPROPERTY(oo, "accion", lee_registro("FTP_ACCION", "N", 1, .F.))
ADDPROPERTY(oo, "origen_destino", lee_registro("FTP_DESTINO", "N", 1, .F.))
ADDPROPERTY(oo, "disco", 1)
ADDPROPERTY(oo, "error", .F.)
ADDPROPERTY(oo, "servidor", lee_registro("FTP_DOMINIO", "C", "www.miftp.com", .F.))
ADDPROPERTY(oo, "usuario", lee_registro("FTP_USUARIO", "C", "miusuario", .F.))
ADDPROPERTY(oo, "contraseña", desencr(lee_registro("FTP_CONTRASEÑA", "C", "micontraseña", .F.)))
ADDPROPERTY(oo, "directorio_remoto", lee_registro("FTP_CARPETA", "C", "micarpeta", .F.))
ADDPROPERTY(oo, "archivo_remoto", 'archivo_remoto.zip')
ADDPROPERTY(oo, "archivo_local", SYS(5) + CURDIR() + 'Computadoras\archivo_local.zip')
ADDPROPERTY(oo, "internet", 0)
ADDPROPERTY(oo, "ftp", 0)
ADDPROPERTY(oo, "total_tablas", 10)


* Conectar
thisform.mensaje.caption = "Abriendo conexión de Internet..."
oo.internet = internetopen("Wininet", 0, .null., .null., 0)
if oo.internet=0
  thisform.mensaje.caption = "¡No se pudo abrir una conexión!"
  =INKEY(1.5, "H")
  return .f.
endif
thisform.mensaje.caption = "Conectando con "+oo.servidor+"..."
oo.ftp = internetconnect(oo.internet, alltrim(oo.servidor), 21, alltrim(oo.usuario), alltrim(oo.contraseña), 1, 134217728, 0)
if oo.ftp=0
  internetclosehandle(oo.internet)
  thisform.mensaje.caption = "¡No se pudo conectar a "+oo.servidor+"!"
  =INKEY(1.5, "H")
  return .f.
else
  thisform.mensaje.caption = "¡Conexión establecida!"
endif

* Subir
* Ya te lo pasé antes

* Bajar
if ftpsetcurrentdirectory(oo.ftp, '/'+oo.directorio_remoto)=0
  thisform.mensaje.caption = "¡No se encontró directorio destino!"
  oo.error = .t.
  return .f.
endif
nfichftp = ftpopenfile(oo.ftp, oo.archivo_remoto, 2147483648 , 2, 0)
if nfichftp=0
  oo.error = .t.
  messagebox("No se pudo abrir el archivo remoto.", 16, _vfp.msgbox_error)
  return .f.
endif
if file(oo.archivo_local)
  erase (oo.archivo_local)
endif
nfich = fcreate(oo.archivo_local)
high_order = 0
low_order = ftpgetfilesize(nfichftp, @high_order)
lnfilelength = high_order*65536+low_order
ntama = 0
nlen = 1
do while nlen<>0
  cbuffer = replicate(chr(0), 2048)
  internetreadfile(nfichftp, @cbuffer, len(cbuffer), @nlen)
  if nlen<>0
    fwrite(nfich, substr(cbuffer, 1, nlen))
    ntama = ntama+nlen
    thisform.mensaje.caption = "Recibiendo datos: "+ltrim(str(ntama*100/lnfilelength))+"%"
  endif
enddo
fclose(nfich)
internetclosehandle(nfichftp)

Rene Jara

unread,
Oct 15, 2014, 7:45:33 PM10/15/14
to publice...@googlegroups.com
Gracias Daniel
lo voy a probar y te cuento como me va
  
Cordialmente
Rene Jara Muñoz
 

Rene Jara

unread,
Oct 16, 2014, 12:50:11 PM10/16/14
to publice...@googlegroups.com
Hola Daniel
la rutina funciono perfectamente, un archivo con mas de 10mb estuvo perfecto
 
muchas gracias x tu ayuda
  
Cordialmente
Rene Jara Muñoz
 

Allan Raúl Acuña

unread,
Oct 16, 2014, 2:13:33 PM10/16/14
to publice...@googlegroups.com
Estimado Rene,

Puedes compartir tu experiencia en códigos?

Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



Date: Thu, 16 Oct 2014 11:50:08 -0500
Subject: Re: [vfp] Re: Usar FTP
From: rene.j...@gmail.com
To: publice...@googlegroups.com

Daniel Del Giudice

unread,
Oct 16, 2014, 2:41:59 PM10/16/14
to publice...@googlegroups.com
Por nada René, espero que le sirva a Kike también.

Rene Jara

unread,
Oct 16, 2014, 3:03:42 PM10/16/14
to publice...@googlegroups.com

DECLARE LONG

InternetOpen IN "wininet.dll" STRING, LONG, STRING, STRING, LONG

DECLARE LONG

InternetConnect IN "wininet.dll" LONG, STRING, LONG, STRING, STRING, LONG, LONG, LONG

DECLARE INTEGER

FtpSetCurrentDirectory IN WinINet.DLL INTEGER, STRING

DECLARE INTEGER

FtpGetFileSize IN wininet INTEGER, LONG @

DECLARE LONG

FtpOpenFile IN "wininet.dll" LONG, STRING, INTEGER, INTEGER, INTEGER

DECLARE LONG

InternetReadFile IN "wininet.dll" LONG, STRING @, LONG, LONG @

DECLARE INTEGER

InternetWriteFile IN WinINet.DLL INTEGER, STRING, INTEGER, INTEGER @

DECLARE INTEGER

InternetCloseHandle IN "wininet.dll" LONG
 

cSitioFTP="misitioftp.com"

cArchivoFTP="/miarchivo.rar"

cArchivoDestino="miarchivo.rar"

cCarpetaDestino="c:\"

miusuario=""

micontraseña=""

* Load

oo =

CREATEOBJECT("empty")

ADDPROPERTY

(oo, "disco", 1)

ADDPROPERTY

(oo, "error", .F.)

ADDPROPERTY

(oo, "archivo_remoto", cArchivoFTP)

ADDPROPERTY

(oo, "directorio_remoto", "/")

ADDPROPERTY

(oo, "servidor", cSitioFTP)

ADDPROPERTY

(oo, "contraseña", micontraseña)

ADDPROPERTY

(oo, "usuario", miusuario)

ADDPROPERTY

(oo, "archivo_local", cCarpetaDestino+cArchivoDestino)

ADDPROPERTY

(oo, "internet", 0)

ADDPROPERTY

(oo, "ftp", 0)

ADDPROPERTY

(oo, "total_tablas", 10)

 

* Conectar

WAIT WIND

"Abriendo conexión de Internet..." NOWAIT

oo.internet = internetopen("Wininet", 0, .null., .null., 0)

if

oo.internet=0

WAIT WIND "No se pudo abrir el fichero" NOWAIT

=INKEY(1.5, "H")

return .f.

endif

WAIT WIND

"Conectando con "+oo.servidor+"..." NOWAIT

oo.ftp = internetconnect(oo.internet,

alltrim(oo.servidor), 21, alltrim(oo.usuario), alltrim(oo.contraseña), 1, 134217728, 0)

if

oo.ftp=0

internetclosehandle(oo.internet)

WAIT WIND "¡No se pudo conectar a "+oo.servidor+"!" NOWAIT

=INKEY(1.5, "H")

return .f.

else

WAIT WIND

"¡Conexión establecida!" NOWAIT

endif

* Bajar

if

ftpsetcurrentdirectory(oo.ftp, '/'+oo.directorio_remoto)=0

WAIT WIND "¡No se encontró directorio destino!" NOWAIT

WAIT WIND "Recibiendo datos: "+ltrim(str(ntama*100/lnfilelength))+"%" NOWAIT

endif

enddo

fclose

(nfich)

internetclosehandle(nfichftp)

 
sirve para bajar un archivo desde un sitio ftp...   lo probe bajando un archivo de 10mb, y si funciona 
  
Cordialmente
Rene Jara Muñoz
 

Allan Raúl Acuña

unread,
Oct 16, 2014, 3:46:02 PM10/16/14
to publice...@googlegroups.com
Excelente, vamos a probarlo.

Y el de subida?


Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



Date: Thu, 16 Oct 2014 14:03:37 -0500

Subject: Re: [vfp] Re: Usar FTP
From: rene.j...@gmail.com
To: publice...@googlegroups.com

 

Kike. Sevilla

unread,
Dec 6, 2014, 12:13:38 PM12/6/14
to publice...@googlegroups.com
Perdón por el retraso. Ha funcionado perfectamente.
Muchas gracias.


El sábado, 11 de octubre de 2014 12:15:43 UTC+2, Kike. Sevilla escribió:
Reply all
Reply to author
Forward
0 new messages