2011-12-01 7 views
6

Próbuję pobrać dużą liczbę obrazów z Internetu za pomocą składnika TidHttp.Używanie TidHttp do pobierania obrazów JPEG z adresu URL (tylko te, które istnieją)?

Problemem jest to, że istnieje szereg obrazów, które są brakujące (przykład: 7403, 7412, etc)

Jak mogę przetestować tylko te, które istnieją i zapisać te złożyć?

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

o ile widzę, że już to robisz, jeśli odpowiedź wynosi 200, a nie widzę, gdzie definiowana jest zmienna numString –

Odpowiedz

11

Nie musisz nic więcej robić. W przypadku próby uzyskania dostępu do nieistniejącego adresu URL serwer HTTP zgłosi błąd polegający na tym, że TIdHTTP jest zawijany w wyjątek EIdHTTPProtocolException. Nie musisz zawracać sobie głowy wywołaniem najpierw numeru TIdHTTP.Head(), ponieważ pobierasz obrazy przed zapisaniem ich na numer TMemoryStream. Możesz wychwycić wyjątek, dzwoniąc pod numer TIdHTTP.Get(), bez konieczności sprawdzania kodu odpowiedzi.

Spróbuj tego:

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; 

rzeczywistości nie potrzebują TImage w celu zapisania danych do pliku. Jeśli można pominąć etap TImage.Picture.Assign(), to kod nieco prostsze dzięki wyeliminowaniu TJPEGImage ogóle (chyba, że ​​próbujesz zweryfikować pliki do pobrania są ważne), np:

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; 

Lub:

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; 
Powiązane problemy