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

前端之家收集整理的这篇文章主要介绍了delphi – 使用TidHttp从URL下载Jpeg图像(只有那些存在的)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用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;

猜你在找的Delphi相关文章