Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Internet y Mail: Cómo descargar ficheros de Internet con Delphi
Delphi


En este artículo os mostramos y explicamos (con código fuente en Delphi 6 incluido) cómo realizar una función que permita descargar ficheros de Internet (ficheros de páginas web: pdf, jpg, gif, mp3, etc). Explicaremos dos métodos parar realizar este cometido. No será necesario el uso de componentes de terceros.



En Delphi se pueden usar varios métodos para realizar descargas desde Internet a través de http e incluso servidores de FTP públicos. Hay métodos que requieren de componentes de terceros, como IPWorks. En este artículo explicaremos cómo realizar descargas de ficheros desde una página web utilizando dos métodos:

1. Utilizando WinInet

WinInet es un API de Windows para Internet (Microsoft Windows Internet Extensions). En el caso de Delphi, WinInet.pas es una unidad de Delphi donde se definen diferentes tipos y funciones para el acceso a contenidos en Internet, para los protocolos HTTP, HTTPS, FTP y Gopher. Para el uso de esta unidad será necesario que esté correctamente registrada la dll (librería) wininet.dll.

Utilizaremos, en concreto, las siguientes funciones del API WinInet: InternetOpenUrl, InternetOpen, InternetReadFile y InternetCloseHandle.

En la cláusula "Uses" del formulario o unidad donde queramos colocar la función descargarFichero colocaremos "wininet". De esta forma indicaremos a Delphi que queremos utilizar las funciones contenidas en la unidad WinInet.pas

Quedará algo así:

unit UnidadMenuPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, 
  Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ComCtrls, 
  ActnList, ImgList, WinInet;

type
  TformMenuPrincipal = class(TForm)
    tab: TPageControl;
	...
	

A partir de la cláusula "Implemantation" de nuestra unidad o formulario podremos añadir la siguiente función, que será la encargada de realizar la descarga del fichero de Internet pasado como parámetro en el fichero local también pasado como parámetro:
...
implementation

{$R *.dfm}

function descargarFichero
    (const urlDescarga, ficheroLocal : String): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
begin
 sAppName := ExtractFileName(Application.ExeName) ;
 hSession := InternetOpen(PChar(sAppName),
     INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ;
 try
  hURL := InternetOpenURL(hSession,
      PChar(urlDescarga), nil, 0, 0, 0) ;
  try
   AssignFile(f, ficheroLocal) ;
   Rewrite(f,1) ;
   repeat
    InternetReadFile(hURL, @Buffer,
        SizeOf(Buffer), BufferLen) ;
    BlockWrite(f, Buffer, BufferLen)
   until BufferLen = 0;
   CloseFile(f) ;
   result := True;
  finally
   InternetCloseHandle(hURL)
  end
 finally
  InternetCloseHandle(hSession)
 end
end;
...

La función descargarFichero devolverá "True" en caso de que la descarga se haya realizado con éxito y "False" en caso de que haya habido algún error.

Para usar esta función añadiremos a nuestro formulario dos componentes de tipo TEdit (para introducir la URL del fichero a descargar de Internet txtURL y el sitio local donde se descargará txtLocal ). Un ejemplo de uso de esta función podría ser:

 if descargarFichero (txtURL.Text, txtLocal.Text) then
   ShowMessage ('Descarga finalizada')
 else
   ShowMessage('No se ha podido realizar la descarga');

Uno de los inconvenientes de utilizar esta función para la descarga de ficheros desde Internet es que no se puede mostrar el progreso de la descarga.

2. Utilizando ExtActns

ExtActns es una unidad de Delphi que incorpora funciones de carácter variado (descarga de ficheros de Internet, envío de email, etc). Es una unidad perteneciente al VCL (Visual Componet Library), con lo cual no será necesario disponer de ninguna librería instalada en el sistema para este uso.

En nuestro caso, para la descarga de ficheros desde Internet, utilizaremos la clase TDownLoadURL.

En la cláusula "Uses" del formulario o unidad donde queramos colocar la función descargarFichero colocaremos "ExtActns". De esta forma indicaremos a Delphi que queremos utilizar las funciones contenidas en la unidad ExtActns.pas

Quedará algo así:

unit UnidadMenuPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants,
  Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ComCtrls,
  ActnList, ImgList, ExtActns;

type
  TformMenuPrincipal = class(TForm)
    tab: TPageControl;
    tabTest: TTabSheet;
    tabConfiguracion: TTabSheet;
	
	...

Puesto que esta función sí permite mostrar el progreso de la descarga, añadiremos en la cláusula "Private" el siguiente código:

    ...
    procedure txtURL2Exit(Sender: TObject);
    procedure txtURL3Exit(Sender: TObject);

  private
    //progreso de descarga
    procedure URL_OnDownloadProgress
        (Sender: TDownLoadURL;
         Progress, ProgressMax: Cardinal;
         StatusCode: TURLDownloadStatus;
         StatusText: String; var Cancel: Boolean) ;

    { Private declarations }


  public
    { Public declarations }
  end;
  ...

Tras el "Implementation" añadiremos la función para realizar la descarga de la URL indicada:

...
var
  formMenuPrincipal: TformMenuPrincipal;

implementation

{$R *.dfm}


procedure TformMenuPrincipal.descargarURL (
    const direccionURL, ficheroLocal : string);
begin
  if direccionURL <> '' then
  begin
    with TDownloadURL.Create(self) do
    try
      URL := direccionURL;
      FileName := ficheroLocal;
      OnDownloadProgress := URL_OnDownloadProgress;
      ExecuteTarget(nil);
    finally
      Free;
    end;
  end;
end;
...

A continuación colocaremos el procedimiento que mostrará el progreso de la descarga en una TProgressBar (que previamente habremos colocado en el formulario de nuestra aplicación Delphi):

procedure TformMenuPrincipal.URL_OnDownloadProgress;
begin
   lInfoDescarga.Caption := 'Descargando '
       + FormatFloat('#,###', Progress / 1024) +
       ' kb de ' + FormatFloat('#,### kb', 
       ProgressMax / 1024);
   lInfoDescarga.Refresh;
   try
     lInfoDescarga2.Caption :=
         FormatFloat('#,###.00  kbytes/segundo',
         ((Progress / SecondSpan (now, tiempoInicial)) 
         / 1024));
   except
     linfoDescarga2.caption := '';
   end;

   bp.Max:= ProgressMax;
   bp.Position:= Progress;
   application.ProcessMessages;
end;

Y por último un ejemplo de uso de esta función:

procedure TformMenuPrincipal.actIniciarTestExecute(Sender: TObject);
begin  
  tiempoInicial := now;


  if txtURL1.Text <> '' then
  begin
    lInfoDescarga.Caption := 'Descargando URL: ' + txtURL.Text;
    lInfoDescarga.Hint := 'Descargando URL: ' + txtURL.Text;
    lInfoDescarga.ShowHint := true;
    lInfoDescarga.refresh;
    descargarURL (txtURL.text, txtLocal.text);
  end;

Donde:

  • lInfoDescarga, lInfoDescarga: componentes de tipo TLabel para mostrar información sobre la descarga (kilobytes descargados, velocidad de descarga, etc).
  • txtURL, txtLocal son componentes de tipo TEdit donde el usuario indicará la dirección de Internet donde se encuentra el archivo a descargar (URL) y la ruta y nombre del fichero en local (su PC) donde se descargará.
  • bp: componente de tipo TProgressBar que mostrará el progreso de la descarga.
  • tiempoIncial: variable de tipo TDateTime, declarada en la cláusula "Private" del formulario. Nos servirá para saber cuándo empezó la descarga y así poder calcular la velocidad de descarga actual según los bytes descargados (Progress).

Un ejemplo de uso de TDownLoadURL lo podréis ver en la aplicación AjpdSoft Test de Velocidad, cuyo código fuente en Delphi 6 está disponible completamente gratis (free) para usuarios registrados (si aún no lo eres pulsa aquí para registrarte):

AjpdSoft Test de Velocidad

AjpdSoft Test de Velocidad


Anuncios


Enviado el Sábado, 19 enero a las 21:24:39 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A