-3

如何在下载之前检查 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;
4

2 回答 2

8

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

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

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

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

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

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

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

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

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

于 2013-03-01T23:32:30.953 回答