2011-12-01 16 views
6

Estoy tratando de recuperar una gran cantidad de imágenes de la web usando un componente TidHttp.Usando TidHttp para descargar imágenes JPEG desde URL (solo las que existen)?

El problema es que hay una serie de imágenes que faltan (Ejemplo: 7403, 7412, etc)

¿Cómo se prueba por sólo aquellos que existen y guardar aquellos a archivo?

procedure TForm.Button1Click(Sender: TObject); 
var 
    MS : TMemoryStream; 
    JPEGImage: TJPEGImage; 
    Url, numString: String; 
    I, Code: Integer; 
begin 
for I := 7400 to 7500 do 
begin 
{ 
    Url  :='http://www.mywebpage.com/images/DSC' + numString+ '.jpg'; 
    try 
    idhttp1.Head(URL); 
    code := idhttp1.ResponseCode; 
    except on E: EIdHTTPProtocolException do 
    code := idhttp1.ResponseCode; 
    end;//try except 
    if code = 200 then 
    begin 

    MS := TMemoryStream.Create; 
    JPEGImage := TJPEGImage.Create; 
    try 
    try 
    idhttp1.Get(Url, MS); //Send the request and get the image 
    code := idhttp1.ResponseCode; 
    MS.Seek(0,soFromBeginning); 
    JPEGImage.LoadFromStream(MS);//load the image in a Stream 
    Image1.Picture.Assign(JPEGImage);//Load the image in a Timage component 
    Image1.Picture.SaveToFile('C:\Museum_Data\DSC' + numString + '.jpg'); 
    Application.ProcessMessages; 
    except 
     on E: EIdHTTPProtocolException do 
     code := idhttp1.ResponseCode; // or: code := E.ErrorCode; 
    end; //try except 
      finally 
    MS.free; 
    JPEGImage.Free; 

    end; //try finally 
    end; //if 

end; 
end; 
+0

en la medida en que puedo ver que ya has hecho eso, si la respuesta es de 200 va para la imagen, pero no veo dónde se define la variable numString –

Respuesta

11

No tiene que hacer nada extra por eso. Si intenta acceder a una URL inexistente, el servidor HTTP informará un error que TIdHTTP que se envuelve en una excepción EIdHTTPProtocolException. No tiene que preocuparse de llamar al TIdHTTP.Head() primero, ya que está descargando las imágenes a TMemoryStream antes de guardarlas. Puede capturar la excepción al llamar al TIdHTTP.Get() por sí mismo, sin necesidad de verificar el código de respuesta.

Prueba esto:

procedure TForm.Button1Click(Sender: TObject); 
var 
    MS: TMemoryStream; 
    JPEG: TJPEGImage; 
    Url: String; 
    I: Integer; 
begin 
    MS := TMemoryStream.Create; 
    try 
    JPEG := TJPEGImage.Create; 
    try 
     for I := 7400 to 7500 do 
     begin 
     Url := 'http://www.mywebpage.com/images/DSC' + IntToStr(I) + '.jpg'; 
     MS.Clear; 
     try 
      IdHTTP1.Get(Url, MS); 
     except 
      on E: EIdHTTPProtocolException do 
      Continue; 
     end; 
     MS.Position := 0; 
     JPEG.LoadFromStream(MS); 
     Image1.Picture.Assign(JPEG); 
     JPEG.SaveToFile('C:\Museum_Data\DSC' + IntToStr(I) + '.jpg'); 
     Application.ProcessMessages; 
     end; 
    finally 
     JPEG.Free; 
    end; 
    finally 
    MS.Free; 
    end; 
end; 

En realidad no necesita el TImage con el fin de guardar los datos en un archivo. Si se puede omitir la etapa TImage.Picture.Assign(), a continuación, el código un poco más simple, eliminando la TJPEGImage por completo (a menos que usted está tratando de validar los archivos de descarga son válidas), por ejemplo:

procedure TForm.Button1Click(Sender: TObject); 
var 
    MS: TMemoryStream; 
    Url: String; 
    I: Integer; 
begin 
    MS := TMemoryStream.Create; 
    try 
    for I := 7400 to 7500 do 
    begin 
     Url := 'http://www.mywebpage.com/images/DSC' + IntToStr(I) + '.jpg'; 
     MS.Clear; 
     try 
     IdHTTP1.Get(Url, MS); 
     except 
     on E: EIdHTTPProtocolException do 
      Continue; 
     end; 
     MS.Position := 0; 
     MS.SaveToFile('C:\Museum_Data\DSC' + IntToStr(I) + '.jpg'); 
     Application.ProcessMessages; 
    end; 
    finally 
    MS.Free; 
    end; 
end; 

O:

procedure TForm.Button1Click(Sender: TObject); 
var 
    FS: TFileStream; 
    Url, FileName: String; 
    I: Integer; 
begin 
    for I := 7400 to 7500 do 
    begin 
    Url := 'http://www.mywebpage.com/images/DSC' + IntToStr(I) + '.jpg'; 
    FileName := 'C:\Museum_Data\DSC' + IntToStr(I) + '.jpg'; 
    FS := TFileStream.Create(FileName, fmCreate); 
    try 
     try 
     try 
      IdHTTP1.Get(Url, FS); 
     except 
      on E: EIdHTTPProtocolException do 
      Continue; 
     end; 
     Application.ProcessMessages; 
     finally 
     Fs.Free; 
     end; 
    except 
     DeleteFile(FileName); 
    end; 
    end; 
end; 
Cuestiones relacionadas