Descargando archivos via FTP

Post Reply
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Descargando archivos via FTP

Post by Loren »

compañeros, buenas:

Tengo la necesidad de descargar desde mi aplicación archivos de un servidor via FTP. El código está escrito desde hace 1 año y funcionando (o al menos eso pensaba), pero observo que aleatoriamente hay veces que descarga el archivo con 0kb y por supuesto, al abrirlo, me genera error.
¿Por qué?... Es problema del código? Es problema del servidor?

Gracias.

Code: Select all

  oInternet:=tinternet():New()
  sysrefresh()
  oFtp     :=tFtp():New(cServer,oInternet,cUser,cPass)
  if !Empty( oFtp:hFtp )
   aFiles :=oFtp:Directory(lower(ALLTRIM(actual_CA)+'/*.'+cextension)) && CUIDADO: Se tiene en cuenta las MAYUSC/minusc
   if Len(aFiles)>0
     SndPlaySound( ".\alarma.wav" )
     oText:SetText('Descargando archivo... espere...')
     GetFileT( (ALLTRIM(actual_CA)+'/'+carchivo),aFiles[nposi,2],oFtp,carchivo,oText,oDlgj) && descargando archivo con la información de las novedades de la nueva versión a instalar
     if file(camino+"\"+carchivo)
      CURSORARROW()
      ShellExecute(,"open",camino+'\'+carchivo) 
     endif
   endif
 endif

....

FUNCTION GetFileT( cSource,nSize,oFtp,cnamefile,oText,oDlguu ) && para descargar el archivo TXT
   LOCAL oFile, hTarget, lValRet:=.F.
   LOCAL nBufSize,cBuffer,nBytes, nTotal:=0,nFile:=0
   nBufSize:=4096
   cBuffer:=Space(nBufSize)
   hTarget := FCreate(camino+'\'+cnamefile)
   oFile := tFtpFile():New( cSource, oFtp )
   oFile:OpenRead()
   WHILE  ( nBytes := Len( cBuffer := oFile:Read( nBufSize ) ) ) > 0
      FWrite( hTarget, cBuffer, nBytes )
      nTotal+=nBytes
      oMeter:Set( nTotal )
      SysRefresh()
   END
   FClose( hTarget )
   oFile:End()
RETURN nTotal==nSize
NOTA: código obtenido siguiendo las instrucciones de nuestro compañero BIEL Maimó
Verhoven
Posts: 435
Joined: Sun Oct 09, 2005 7:23 pm

Re: Descargando archivos via FTP

Post by Verhoven »

Te pongo el hilo anterior con el mismo problema aunque no se terminó de obtener una explicación a ese problema. Y eso que en mi caso utilizo el propio FTP del sistema operativo de Windows.
http://forums.fivetechsupport.com/viewt ... 29#p193100
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Descargando archivos via FTP

Post by Loren »

Buenos días:

Los técnicos de mantenimiento del servidor me responden escuetamente informándome de los siguiente:

"Recuerda que la conexión la debes realizar en modo pasivo y sin utilizar ningún tipo de encryptación ni TLS"

Leyendo en otros foros sobre conexiones FTP, obtengo como conclusión que el problema está en la conexión, que debe hacerse en "modo pasivo".

Ahora, la duda está en "como hago una conexión en modo pasivo" ??

Mil gracias!

Un saludo.
LORENZO.
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Re: Descargando archivos via FTP

Post by Biel EA6DD »

Code: Select all

HINTERNET InternetConnect(
  _In_ HINTERNET     hInternet,
  _In_ LPCTSTR       lpszServerName,
  _In_ INTERNET_PORT nServerPort,
  _In_ LPCTSTR       lpszUsername,
  _In_ LPCTSTR       lpszPassword,
  _In_ DWORD         dwService,
  _In_ DWORD         dwFlags,
  _In_ DWORD_PTR     dwContext
);
dwFlags [in]
Options specific to the service used. If dwService is INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE causes the application to use passive FTP semantics.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Descargando archivos via FTP

Post by Loren »

Biel, mil gracias por contestar:

Busqué en foros y google y encontré la forma de conectar:

Code: Select all

 hWinINet    := WinINet()
oInternet   := InternetOpen( "Anystring", 1, 0, 0, 0 )
if hConnect := InternetConnect( oInternet, cServer, 21, cUser, cPass, 1, 0, 0 ) ==0  && primer 0=puerto (21), 1, 2, 0
 msginfo('NO puedo conectar a '+cServer) ; return
endif
cnom:='Publicomercios.bmp'
cSource=(ALLTRIM(actual_CA)+cnom)
hSource = FTPOPENFILE( hConnect, cSource , 2147483648, 0, 0 )
hDest = FCREATE( camino+cnom )
do while .t.
  nRead = INTERNETREADFILE( hSource, @cData )
  if nRead = -1
     msginfo( "Download error" )
     exit
  endif
  if nRead = 0
     msginfo( "Download OK" )
     exit
  endif
  FWRITE( hDest, cData, nRead )
enddo
if file(camino+cnom)
  msginfo('filesize: '+str(FileSize(camino+cnom)))
 else
  msginfo('En PC NO encuentro el archivo '+cnom)
ENDIF
INTERNETCLOSEHANDLE( hSource )
INTERNETCLOSEHANDLE( hConnect )
INTERNETCLOSEHANDLE( oInternet )
...
...


DLL32 FUNCTION InternetOpen( cApp as LPSTR, n1 AS DWORD, n2 AS LPSTR, n3 AS LPSTR,;
                             n4 AS DWORD ) AS LONG PASCAL ;
                             FROM "InternetOpenA" LIB hWinINet

DLL32 FUNCTION InternetConnect( hSession AS LONG, cHost AS LPSTR, nPort AS LONG,;
                                cUserName AS LPSTR, cPassword AS LPSTR, n4 AS LONG, n5 AS LONG,;
                                n6 AS LONG ) AS LONG PASCAL ;
                                FROM "InternetConnectA" LIB hWinINet
Conecto bien!!... y aparentemente descarga, pero me lo descarga igual, vacio, con 0kb. :( :( :(

¿Algún alma caritativa?

Mil gracias. LORENZO.
Verhoven
Posts: 435
Joined: Sun Oct 09, 2005 7:23 pm

Re: Descargando archivos via FTP

Post by Verhoven »

Yo probaría con un cliente ftp como filezilla o el propio que trae el sistema operativo para ver si te da el mismo fallo. Eso te ayudará a ir descartando posibilidades. Y a probar configuraciones distintas del modo de bajada de archivos hasta que des con la solución.
Post Reply