在下载之前检查jpg url是否存在(以防止异常)

时间:2013-03-01 23:21:58

标签: delphi delphi-2010

如何在下载之前查看JPG网址是否存在,以避免出现异常?

procedure TForm1.Button1Click(Sender: TObject);
var
  FS: TFileStream;
  Url, FileName: String;
  I, C: Integer;
begin
  for I := 1 to 1000 do
  begin
    Url := 'http://www.mysite.com/images/' + IntToSTr(I) + '/Image.jpg';
    FileName := 'C:\Images\' + IntToStr(I) + '.jpg';
    FS := TFileStream.Create(FileName, fmCreate);
    try
      try
        IdHTTP1.Get(Url);
        c := IdHTTP1.ResponseCode;
        if C = 200  then
          IdHTTP1.Get(Url, FS);
      except
      end;
      Application.ProcessMessages;
    finally
      Fs.Free;
    end;
  end;
end;

2 个答案:

答案 0 :(得分:8)

要回答您的主要问题,您必须检查特定网址是否有效的唯一方法是检查网络服务器并检查服务器告诉您的内容。

使用indy,您可以使用Get和其他方法的AIgnoreReplies参数来指示TIdHTTP实例在Web服务器返回状态时不引发异常,如下所示:

IdHTTP1.Get(Url, FS, [404]);

如果状态不同于200和400,仍会引发异常。根据组件的各种配置,还有其他状态代码可能不会引发异常,例如状态代码401和身份验证参数,以及其他

那说, 我在你的代码中发现了几个问题:

  • 你有杀死任何异常的try / except块,任何异常,无论异常的性质如何。它将EOutOfMemory视为EIdSocketErrorEIdHTTPProtocolException甚至是EMayanWorldEnd例外情况!
  • 您下载图像两次...只是忽略第一个下载的数据并使用尝试来确定资源是否存在。如果你感觉,你必须检查资源是否存在,不要对它执行GET命令,执行HEAD
  • 不要使用Application.ProcessMessages,将代码移动到线程!
  • 学会以正确的方式处理您可能获得的不同状态代码以及您可能会发现的其他错误。一开始很难,但如果你想让它变得强大,那就是要走的路。不同的错误可能是:
    • HTTP状态代码,例如:
      • 请求TimeOut(减速并重试)
      • 不支持HTTP版本(好吧,尝试使用其他版本)
    • 网络故障
      • 互联网不断下载
      • WebServer已关闭
    • 作为一般规则,让任何其他不知道如何处理的例外......或者如果你别无选择,吃掉它们但记录正在发生的事情并阅读日志,这样你就会提高你的知识水平技能。

答案 1 :(得分:2)

如果您首先下载所有互联网,那么您可以检查您的Exabyte数据收集是否存在该图片。

否则,您将不得不处理该文件不存在的情况。

您还必须处理各种其他错误,例如超时,或者您的网络抓取器达到下载限制并被阻止。