我试图使用TidHttp组件从Web检索大量图像.
问题是缺少许多图像(例如:7403,7412等)
我如何仅测试那些存在并将其保存到文件?
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;
解决方法
你不必为此做额外的事情.如果您尝试访问不存在的URL,HTTP服务器将报告TIdHTTP错误而不是包装到EIdHTTPProtocolException异常中.您不必先打扰调用TIdHTTP.Head(),因为您在保存之前将图像下载到TMemoryStream.您可以在单独调用TIdHTTP.Get()时捕获异常,根本不需要检查ResponseCode.
试试这个:
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;
实际上,您不需要TImage来将数据保存到文件中.如果您可以省略TImage.Picture.Assign()阶段,那么通过完全消除TJPEGImage(除非您尝试验证下载文件是有效的),代码更简单一点,例如:
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;
要么:
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;