Inicio > Aplicación, Ejemplos, Programación > TidHTTP; Descargar imágenes de una Web

TidHTTP; Descargar imágenes de una Web

Jueves, 10 de febrero de 2011 Dejar un comentario Ir a comentarios

Haciendo pruebas con el componente TidHTTP me ha surgido este ejemplo y me parece interesante mostrar el proceso completo que he seguido para descargar contenido desde una web. En este caso he accedido a las imágenes en formato PNG, pero es extensible a cualquier otros contenidos.

En un primer paso se trata de obtener el contenido (source) desde una página web y a partir de ahí, extraer los links (en mi caso correspondientes a imágenes en formato PNG) y descargar los ficheros para almacenarlos en disco. Para ello utilizaremos el control TidHTTP de la Indy.

Para obtener el código fuente de la página podemos utilizar un código como este:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  // URL de la página
  StrURL := ... ;
  // Crear componente para acceder
  IdH := TIdHTTP.Create(nil);
  // proteccion para liberar
  try
    // proteccion por error
    try
      // Obtenemos la pagina
      Resp := IdH.Get(Trim(StrURL));
      // recuperamos la respuesta
      TSContent.Text  := Resp;
    except
      on E:Exception do begin
        MessageDlg('Error al acceder a la página. '+#13+#10+
                         'Mensaje: ' +
                         E.Message, mtError, [mbOK], 0);
      end;
    end;  // try
  finally
    IdH.Free;
  end;

Una vez que obtenemos la respuesta del componente almacenamos el contenido de la página en un TStrings. Si accedemos a la página: http://neftali.clubdelphi.com/temporal/ejemplo1.html

Obtendremos como resultado del Get el siguiente texto, que corresponde al código fuente de la página:

Lo siguiente que vamos a hacer es un simple “parseo” buscando los enlaces que nos interesen. En nuestro ejemplo queremos links a imágenes en formato png. Utilizando funciones de la clase SysUtils podemos obtener sin mayor problemas los links contenidos en el código; Si probáis con la página de ejemplo, deberíais obtener un único link:

http://neftali.clubdelphi.com/images/GLibWMI_paleta_1.8b.png

Por último, nos queda ver el código necesario para descargar la imagen y almacenarla en disco. Para ello podemos utilizar de nuevo el componente TidHTTP. En mi caso, y en previsión de que pueda haber varias imágenes a descargar, he creado una clase derivada de TThread para ello:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  {: Clase para descargar una imagen y almacenarla en disco.}
  TDownImageThread = class(TThread)
  private
    FURLImage: string;
    FPathImage: string;
    FFileNameImage: string;
    // Internas
    ImageName: string;
    PathURL: string;
    // Componente
    idH:TidHTTP;
  public
    // redefinir métodos
    constructor  Create(AURL:string; AOutPathImages:string);
    destructor Destroy; override;
    procedure Execute; override;
    {: URL de la imagen a descargar. }
    property URLImage:string read FURLImage write FURLImage;
    {: Path de disco local donde voy a almacenar la imagen.}
    property PathImage:string read FPathImage;
    {: Nombre completa (path+Nombre) de la imagen almacenada en disco local}
    property FileNameImage:string read FFileNameImage;
  end;

Al crear el Thread (método Create) ya pasamos como parámetros, la URL de la imagen a descargar y el Directorio inicial donde se van a guardar las imágenes encontradas.
El método Execute creamos un componente TidHTTP (igual a como lo hemos hecho antes), pero en este caso utilizamos un TFileStream para recoger el fichero que descargamos y almacenarlo en disco.

Utilizamos el Path de la URL para generar diferentes directorios para las diferentes imágenes:

···················································································································
URL: http://neftali.clubdelphi.com/images/GLibWMI_paleta_1.8b.png
Path: images
FileName: GLibWMI_paleta_1.8b.png
···················································································································

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//: recupara la imagen y la guarda en disco
procedure TDownImageThread.Execute();
var
  Stream:TFileStream;
  IdH:TidHTTP;
  path:string;
  dir:string;
begin
  // Directorio de salida
  dir := AnsiReplaceText(PathURL, '/', STR_EMPTY);
  // Nombre vacío
  if (ImageName = STR_EMPTY) then begin
    Exit;
  end;
  // Path de salida
  path := IncludeTrailingBackslash(IncludeTrailingBackslash(PathImage)
          + dir) + ImageName;
  // Crearlo por si no existe
  ForceDirectories(ExtractFilePath(path));
  try
    // Stream para la imagfen
    Stream  := TFileStream.Create(path, fmCreate);
    try
      //recuperar la imagen
      IdH := TidHTTP.Create(nil);
      IdH.AllowCookies := True;
      // proteccion
      try
        IdH.Get(Trim( FURLImage), Stream);
      except
        // Error al descargar la imagen
        //..  Volcarlo al log
      end;
    finally
      // Liberar
      idH.Free;
      Stream.Free;
    end;
    // Path de salida
    FFileNameImage := path;
  except
    // error al crear el fichero
    //...  Log
  end;
end;

El resultado se puede ver en este ejemplo.

Una vez descargadas las imágenes se muestran en un componente en la misma aplicación, y desde ahí podemos acceder a la información de la imagen y realizar algunas acciones sobre ellas.

Para realizar pruebas podéis introducir, por ejemplo direcciones como:

Como siempre podéis descargar los fuentes y los binarios de ejemplos.

<DESCARGAR SOURCES>

<DESCARGAR BINARIO>

Un saludo.

  1. Sin comentarios aún.
  1. Miércoles, 9 de marzo de 2011 a las 12:25 | #1
Escribe la palabra "humano" en el cuadro/Write the word "humano" in answer.
Please leave these two fields as-is:
IMPORTANTE! Para continuar, debes contestar la pregunta anterior (para evitar SPAM) :-)