【问题标题】:Check if jpg url exists before downloading (to prevent an exception)下载前检查jpg url是否存在(防止异常)
【发布时间】:2013-03-01 23:21:58
【问题描述】:

如何在下载之前检查 JPG url 是否存在,以避免异常?

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;

【问题讨论】:

  • 您必须处理异常。请注意,除了错误 404 之外,还可能出现不同的错误,并且由于 Indy 是由异常驱动的,因此必须处理它们。在this question 中提出了类似的问题。
  • 另一方面,如果要避免异常,请在AIgnoreReplies参数中包含404状态。
  • @jachguate,忽略状态 404 将使代码不安全。想想可能发生的其他异常情况。
  • Johnny,IdHTTP1.Get(Url, FS, [404]);,但如果您遇到不同的错误,祝您好运。 @jachguate,这就是我为TIdHTTP 写关于异常处理的帖子的原因。
  • Eww, Application.ProcessMessages :(

标签: delphi delphi-2010


【解决方案1】:

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

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

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

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

也就是说, 我在您的代码中发现了几个问题:

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

【讨论】:

  • 最后一点,不要依赖 StackOverflow 或任何网站的人来教你需要知道的一切。花点时间自己弄清楚事情是如何运作的。没有冒犯,但是这个世界已经变得懒惰与互联网并且总是期望其他人给他们完全编码和完整的答案。问题是,人们在免费网站上回答问题是没有报酬的,所以人们通常不想为你做你的工作。我敢肯定,如果我因回答问题而获得报酬,我会为他们完成某人的整个项目。
【解决方案2】:

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

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

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

【讨论】:

  • 我会选择完整的下载解决方案,看起来很合理
猜你喜欢
  • 2011-01-29
  • 2012-08-07
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多