Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Descargar imagenes desde una URL (https://www.clubdelphi.com/foros/showthread.php?t=57392)

jamlaboira 13-06-2008 10:28:43

Descargar imagenes desde una URL
 
Hola, necesito descargar una serie de imagenes desde una URL determinada.
Este proceso lo tengo que hacer de forma automatizada, es decir, el programa debe descargar unas 250 imágenes cada semana y asignarles un nombre de fichero en el equipo local que se han descargado.

Ejemplo: La imagen está en http://www.dominio.com/imagen1.jpg
y necesito bajarla a mi equipo con el nombre catalogo_imagen1.jpg
(Así unas 250 veces de forma automática.)

He pensado utilizar el componente TWebBrowser, pero no he trabajado nunca con él...¿Alguien me puede ayudar con esto?

Un saludo a toda/os y Gracias de antemano...!!

dec 13-06-2008 15:02:54

Hola,

¿Tienes los componentes Indy instalados? Probablemente sí, y entonces podrías usar el componente "TIdHttp". En este hilo se muestra cómo. Existe algunos otros componentes de terceros, pero, incluso podrías usar la librería WinInet, que se incluye con Windows. En este otro hilo, probablemente, encuentres información acerca de varias de estas posibilidades que se te ofrecen.

PD. Bienvenido al ClubDelphi. ;)

jamlaboira 13-06-2008 15:30:28

Gracias dec, no he trabajado con Indy, pero veo en el hilo que me has facilitado que no tiene gran dificultad...Creo que es justo lo que ando buscando.

Muchas gracias de nuevo por tu rápida respuesta.

jamlaboira 13-06-2008 17:24:23

Hola de nuevo dec, he revisado el código de Indy, pero al ejecutarlo me da un error en la siguiente línea:

IdHTTP.Get( URL+'/'+FICHERO, Stream );

Get: Undeclared identifier

¿Una ayudita, por favor....?

Gracias de nuevo

jamlaboira 15-06-2008 10:17:00

Me faltaba un simple Form1. delante (ya que el control está en Form1...)

De todas formas, me he dado cuenta de que el fichero origen está en formato indirecto a traves de un extractor de imágenes cgi y no me funciona, pongo un ejemplo real a ver si alguien tiene una idea feliz, a mi no se me ocurre nada de nada...

Código Delphi [-]
 procedure PedirImagen( URL, FICHERO, DIR_DESTINO:string );
  var
    Stream      : TFileStream;
  begin
  { re-crear el DIRECTORIO de destino por si no estuviese }
    ForceDirectories( DIR_DESTINO );
    Stream  := TFileStream.Create( DIR_DESTINO + '\' + FICHERO, fmCreate);
    try
      Form1.idHttp.Get ( URL + '/' + FICHERO, Stream );
    finally
      Stream.Free;
    end;
  end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  PedirImagen( 'http://www.infortisa.com/spa/item/extractimg.cgi?action=large&code=420038', '420038.jpg', 'c:\pruebas\imagenes' );
end;

Gracias por anticipado...!!

dec 16-06-2008 13:33:22

Hola,

A bote pronto se me ocurre algo como lo siguiente, basado en código fuente del maestro Seoane. ;)

Código Delphi [-]
uses
  SysUtils, Dialogs, WinInet;

function DownloadToStream(Url: string; Stream: TStream): Boolean;
var
  hNet: HINTERNET;
  hUrl: HINTERNET;
  Buffer: PChar;
  BytesRead: DWORD;
begin
  Result := FALSE;
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hUrl := InternetOpenUrl(hNet, PChar(Url), nil, 0,
      INTERNET_FLAG_RELOAD, 0);
    if (hUrl <> nil) then
    begin
      GetMem(Buffer,100*1024);
      try
        while (InternetReadFile(hUrl, Buffer, 100*1024, BytesRead)) do
        begin
          if (BytesRead = 0) then
          begin
            Result := TRUE;
            break;
          end;
          Stream.WriteBuffer(Buffer^,BytesRead);
        end;
      finally
        FreeMem(Buffer);
      end;
      InternetCloseHandle(hUrl);
    end;
    InternetCloseHandle(hNet);
  end;
end;

function DownloadImage(actionParam, codeParam, outputDir: string): boolean;
const
  IMG_EXT = '.jpg';
  BASE_URL = 'http://www.infortisa.com/spa/item/extractimg.cgi?action=%s&code=%s';
var
  fStream: TFileStream;
  imgUrl, imgPath: string;
begin
  imgUrl := Format(BASE_URL, [actionParam, codeParam]);
  imgPath := ExtractFilePath(outputDir) + codeParam + IMG_EXT;
  fStream := TFileStream.Create(imgPath, fmCreate);
  try
    result := DownloadToStream(imgUrl, fStream);
  finally
    fStream.Free();
  end;
end;

(* Ejemplo de uso
*)
procedure TForm1.Button1Click(Sender: TObject);
begin
  if DownloadImage('large', '420031', 'C:\') then
    ShowMessage('Imagen descargada')
  else
    ShowMessage('No pudo descargarse la imagen');
end;


La franja horaria es GMT +2. Ahora son las 00:29:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi