Page 1 of 1

Cliente FTP con FW+xH

Posted: Tue Jan 24, 2012 11:07 am
by gsabattino
Hola Gente... Buen Día a tod@s!!!
Feliz y Prospero 2012!!!

Tenia mucho tiempo si entrar al foro y veo muchos nombres nuevos, lo cual me dice mucho de la aceptación de FW por la comunidad de programadores...

Se me esta presentando una necesidad, nueva para mi, en la que necesito subir y bajar archivos de datos en un servidor FTP desde FW... Mirando los los fuentes veo que estan clases tFTP, tFTPCli, tFTPFile, tFTPServ, y tFTPSess; y en los ejemplos estan FTPDir y FTPServ...
Por lo pronto la cosa se me ha trancado porque me sale un dialogo que me dice "Cannot load WinINet.dll!"... buscando encontre que esa DLL es parte de Windows, se encuentra en la carpeta System32 de Windows... la copie a la carpeta donde estoy tratando de que el ejemplo corra, y aun asi no hay forma...

Me gustaria una orientación de parte de quienes hayan tenido alguna experiencia accediendo a un servidor FTP desde FW...

Agradezco de antemano cualquier tip/orientación/comentario al respecto...

Giancarlo J. Sabattino
Valencia, Venezuela

Re: Cliente FTP con FW+xH

Posted: Tue Jan 24, 2012 12:18 pm
by postinelli
Así hago yo para subir archivos a un ftp

//----------------------------------------------------------------------------//
Function FTPSendFiles( cFTPSite, aSource, aTarget, cUserFtp, cPassFtp )

Local lEnd := .f.
Local nBufSize := 2000
Local oInternet, oFTP

MsgRun( "Conectando al Sitio FTP...", "Espere...",;
{ || oInternet := TInternet():New(),;
If( Empty( oInternet:hSession ),;
MsgAlert( "Sin Conexión a Internet!" ),),;
oFTP := TFTP():New( cFTPSite, oInternet, Alltrim(cUserFtp),Alltrim(cPassFtp) ) } )

if Empty( oFTP:hFTP )
MsgStop( "Imposible Conectarse al Sito FTP!" )
return nil
endif

SendFiles( aSource, aTarget, nBufSize, lEnd, oFTP )

oInternet:End()

return nil
//----------------------------------------------------------------------------//
Static Function SendFiles( aSource, aTarget, nBufSize, lEnd, oFTP )

Local n
Local hSource
Local cBuffer := Space( nBufSize )
Local nBytes, nFile := 0, nTotal := 0
Local nTotSize := 0
Local oFile

for n = 1 to Len( aSource )
if ! File( aSource[ n ] )
MsgStop( "Archivo No Encontrado: " + aSource[ n ] )
exit
endif
hSource = FOpen( aSource[ n ] )
nTotSize += FSeek( hSource, 0, 2 )
FClose( hSource )
next

for n = 1 to Len( aSource )
hSource = FOpen( aSource[ n ] )

oFile = TFtpFile():New( aTarget[ n ], oFTP )
oFile:OpenWrite()
FSeek( hSource, 0, 0 )
nFile := 0
while ( nBytes := FRead( hSource, @cBuffer, nBufSize ) ) > 0 .and. ! lEnd
oFile:Write( SubStr( cBuffer, 1, nBytes ) )
end
FClose( hSource )
oFile:End()
if lEnd
exit
endif
next
Return nil
//----------------------------------------------------------------------------//

Re: Cliente FTP con FW+xH

Posted: Tue Jan 24, 2012 6:15 pm
by gsabattino
Gracias por el ejemplo...
Lo copie tal cual, pero aun me sigue saliendo el dialogo con el mensaje "Cannot load WinINet.dll!"...
pero... dos maquinas tengan el mismo problema??

Seguire buscando, pero aun asi acepto mas tips/ejemplos/sugerencias/comentarios...

Re: Cliente FTP con FW+xH

Posted: Tue Jan 24, 2012 8:40 pm
by lucasdebeltran
Giancarlo,

¿Qué versión de FWH y de Harbour usas?.

Tiene pinta de que tienes una versión antigua...

Re: Cliente FTP con FW+xH

Posted: Sun Jan 29, 2012 9:34 am
by russimicro
Esta solución me funciona perfecto..
viewtopic.php?f=6&t=20501&p=108900&hilit=JOHNSON+RUSSI#p108900

Johnson Russi
Colombia

Re: Cliente FTP con FW+xH

Posted: Sun Jan 29, 2012 12:26 pm
by Manuel Valdenebro
1) Tienes que comenzar añadiendo en la cabecera los siguientes includes:

#include "Fivewin.ch"
#include "wininet.ch"

2) Escribe la siguiente funcion:

FUNCTION SubirFtp( cFtpAddress, cUser, cPass, cOrigen, cDestino, nPort, nService )
local hWinInet, hInternet, hConnect, lOk

// cargamos la DLL si no estaba cargada
hWinINet := WinINet()

if hWinINet < 0 .or. hWinINet >= 32
hInternet := InternetOpen( "Valdenebro", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 )
endif

hConnect := INTERNETCONNECT( hInternet, cFtpAddress, nPort, cUser, cPass, nService, 0, 0 )

IF hconnect == 0
ALERT ("ERROR EN CONEXION.",,"Descarga","X",,.t.)
ELSE
TRY
lOk := FTPPUTFILE( hConnect, cOrigen, cDestino, 0, 0 )
alert (lOk)
CATCH
ALERT ("Error FTP.",,"Descarga","X",,.t.)
END

ENDIF

INTERNETCLOSEHANDLE( hConnect )

INTERNETCLOSEHANDLE( hInternet )

RETURN nil


3) Llama a esa funcion desde cualquier parte de tu programa, sustituyendo las variables por las tuyas:
SubirFtp("ftp.xxxx.com",;
"nombreUsuarioFTP",;
"claveUsuarioFTP",;
"csv/pepe1.txt", ; // donde tienes el fichero origen
"/html/csv/pepe2.txt",; // donde quieres colocar en el servidor el fichero
21, 1 ) // 21 es el puerto FTP y 1 es el servicio


4) Si no te funciona, tómate un Redbull y prueba de nuevo.

Re: Cliente FTP con FW+xH

Posted: Sun Jan 29, 2012 7:14 pm
by roberio
usando script:

Code: Select all


UploadFtp("c:\temp\clientes.txt")
DownloadFtp("clientes.txt")
DeleteFtp("clientes.txt")

*-----------------------------------------------------
Function DownloadFtp(cFile)
   oText=TTxtFile():New("c:\script.txt")
   oText:Open()
   oText:Add("SeuLogin")
   oText:Add("SuaSenha")
   oText:Add("binary")
   oText:Add("get /www/test/"+cFile+" c:\clientes1.txt") // pega o arquivo do ftp(pasta /www/test/) e grava no C: com o nome clientes1.txt 
   oText:Add("bye")
   oText:Add("quit")
   oText:Close()

   MyRun("ftp -s:c:\script.txt ftp.teste.net.br") // seu servidor de ftp nessa linha

   FERASE( "c:\script.txt" )
Return nil
*-----------------------------------------------------
Function UploadFtp(cFile)
 FERASE("c:\script.txt" )

   oText=TTxtFile():New("c:\script.txt")
   oText:Open()
   oText:Add("SeuLogin")
   oText:Add("SuaSenha")
   oText:Add("binary")
   oText:Add("cd /www/test") //abri pasta para upload
   oText:Add("put "+cFile)   // envia o arquivo para para pasta aberta do ftp
   oText:Add("bye")
   oText:Add("quit")
   oText:Close()

   MyRun("ftp -s:c:\script.txt ftp.teste.net.br")

 FERASE("c:\script.txt" )

Return nil
*-----------------------------------------------------
Function DeleteFtp(cFile)
   oText=TTxtFile():New("c:\script.txt")
   oText:Open()
   oText:Add("SeuLogin")
   oText:Add("SuaSenha")
   oText:Add("binary")
   oText:Add("delete /www/test/"+cFile) deleta o arquivo da pasta /www/test do seu ftp
   oText:Add("bye")
   oText:Add("quit")
   oText:Close()

   MyRun("ftp -s:c:\script.txt ftp.teste.com.br")

   FERASE( "c:\script.txt" )
Return nil

//----------------------------------------------------------*--------------------------------
Function MYRUN( cComando )
Local oShell, RET

  oShell := CreateObject( "WScript.Shell" )
  RET := oShell:Run( "%comspec% /c " + cComando, 0, .T. )
  oShell := NIL

Return iif( RET = 0, .T., .F. )

 

Re: Cliente FTP con FW+xH

Posted: Mon Jan 30, 2012 1:10 am
by carlos vargas
Estimados, he encontrado que en las versiones recientes de fwh y xharbour, con harour no he probado
la funcion file esta fallando en ubicar archivos ubicados en la misma carpeta de la applicacion
esto luego de ocupar la instrucion set defa to

por ejemplo

Code: Select all

?file("miapp.exe")   //aca retorna .t.
set defa to d:\miapp\datos
?file("miapp.exe")   //aca retorna .f.
set path to ".\"
?file("miapp.exe")   //aca retorna .t.

Re: Cliente FTP con FW+xH

Posted: Wed May 02, 2012 1:52 am
by gsabattino
Gracias a todos por sus aportes...

Ciertamente mis versiones de xHarbour y de FW estaban algo desactualizadas, por lo que antes de intentar otras alternativas (incluidas algunas de las que me han sugerido en este hilo) decidi actualizar mis versiones de xH, FWH, y los sistemas que he desarrollado con esas herramientas.

Sin embargo, una vez estando actualizado me encontre que los ejemplos igual muestran el mensaje de error "Cannot load WinINet.dll!" lo cual aparentemente, y segun lo que he leido en otros hilos, se debe a algun problema de compatibilidad entre xH, FW y Windows, ya que aun teniendo la ultima version de WinINet.dll, y teniendo todos los paths bien direccionados se mantiene el problema de que no se carga la fulana DLL.

Veo que yo no he sido el unico al que se le ha presentado el problema, y las soluciones siguen siendo problematicas porque en la mayoría de _ no funcionan, sin embargo di con un post de Enrico Maria Giordano donde plantea una solución que me funcionó perfecto y de hecho creo que es lo que a la final implementaré... http://fivetechsupport.com/forums/viewt ... tp#p123966

El tema de los scripts me parece interesante... no lo he probado, pero seguro que lo haré en lo que tenga algun rato libre...

Gracias a Todos por su apoyo y su granito de arena...
Un Abrazo y seguro los estaré molestando en alguna otra oportunidad.

Giancarlo J. Sabattino S.
Valencia, Venezuela