使用TidHttp从URL下载Jpeg图像(只有那些存在的)?

时间:2011-12-01 01:00:06

标签: delphi delphi-2010 delphi-7

我正在尝试使用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;

1 个答案:

答案 0 :(得分:11)

您无需为此做任何额外的事情。如果您尝试访问不存在的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;