2011-12-01 6 views
6

Sto cercando di recuperare un gran numero di immagini dal web usando un componente TidHttp.Utilizzo di TidHttp per scaricare le immagini Jpeg dall'URL (solo quelle esistenti)?

Il problema è che c'è un certo numero di immagini che mancano (Esempio: 7403, 7412, ecc)

Come faccio a testare solo per quelle che esistono e salvare quelli per il file?

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

per quanto posso vederti farlo già, se la risposta è 200 per l'immagine, ma non vedo dove è definita la variabile numString –

risposta

11

Non devi fare nulla in più per quello. Se si tenta di accedere a un URL inesistente, il server HTTP segnalerà un errore pari a TIdHTTP rispetto a un'eccezione EIdHTTPProtocolException. Non devi preoccuparti di chiamare prima TIdHTTP.Head(), dal momento che stai scaricando le immagini su uno TMemoryStream prima di salvarle. È possibile rilevare l'eccezione quando si chiama TIdHTTP.Get() da solo, non è necessario controllare il ResponseCode.

Prova questo:

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; 

Non è effettivamente necessario il TImage al fine di salvare i dati in un file. Se è possibile omettere la fase TImage.Picture.Assign(), quindi il codice un po 'più semplice, eliminando la TJPEGImage del tutto (a meno che non si sta cercando di convalidare i file di download sono validi), ad esempio:

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; 

Oppure:

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;