11 junio 2007

Descargando archivos por FTP con INDY

El compononente IdFTP que utilizamos en el artículo anterior para subir archivos es el mismo que vamos a utilizar para descargarlos. Añadimos a la sección interface:

uses
Windows, Messages, ......, IdFTP, IdComponent;

Y creamos el procedimiento para descargar el archivo:

procedure DescargarArchivo( sArchivo: String );
var
FTP: TIdFTP;
begin
FTP := TIdFTP.Create( nil );
FTP.OnWork := FTPWork;
FTP.Username := 'usuario';
FTP.Password := 'miclave';
FTP.Host := 'miftp.midominio.com';

try
FTP.Connect;
except
raise Exception.Create( 'No se ha podido conectar con el servidor ' + FTP.Host );
end;

FTP.ChangeDir( '/misarchivos/copiaseguridad/' );

Antes de comenzar la descarga hay que averiguar el tamaño del archivo en el servidor:

Barra.Max := FTP.Size( ExtractFileName( sArchivo ) ) div 1024;

Donde Barra es un objeto TProgressBar que colocamos para mostrar al usuario el progreso de la descarga. Ahora nos aseguramos de que el archivo a descargar no haya sido descargado anteriormente, ya que podría producir un error:

if FileExists( sArchivo ) then
DeleteFile( sArchivo );

Para descargar el archivo utilizaremos el método Get, el cual toma como primer parámetro la ruta y nombre del archivo a descargar en local, como segundo parámetro el nombre que va a tener el archivo en el servidor, como tercer parámetro si deseamos añadir a un archivo ya existente y como último parámetro si deseamos la opción RESUME (en caso de interrumpirse la conexión si queremos que continue por donde iba, siempre y cuando el servidor soporte dicho modo).

FTP.Get( ExtractFileName( sArchivo ), sArchivo, False, False );

Para finalizar nos desconectamos del servidor y eliminamos el objeto.

FTP.Disconnect;
FTP.Free;
end;

También creamos el evento OnWork para controlar el progreso de la descarga:

procedure TFVentana.FTPWork( Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer );
begin
Barra.Position := AWorkCount div 1024;
end;

Para terminar recomiendo meter el método Get en un hilo de ejecución por si el componente se queda bloqueado en la descarga.

Pruebas realizadas en Delphi 7.

5 comentarios:

Anónimo dijo...

Fantastic work!! This information helps me a lot, really don't know how can I reward you for this thread (maybe if i let you touch my big tits cute boy ^^)

I'm sure you like it

José Torres dijo...

excelente! Ayer encontré tu código y me fué de gran ayuda, muchas gracias

Unknown dijo...

Me marca un error en ftpwork undeclared identifier

Unknown dijo...

buenas amigo no entiendo como haces para poner en una ventana modal la barra y pasarle los paramestros del FTPWork, si puedes ser mas espesifico y al igualatas el FTP.OnWork:= FTPWork; no se porque te funciona asi si el eventro FTPWork hay que pasarle unos parametros y quedaria algo asi FTP.OnWork:=FTPWord("como pasas estas variables al evento para que las tome la barra de progreso");

Mcorp dijo...

Tengo un problema, cuando descarga el archivo dice: Connection Closed Gracefully. luego que doy Ok al mensaje lo termina de descargar, y si ya lo he descargado y hago nuevamente el proceso, dice: Destination file already exists.

Publicidad