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

Jak*_*ays -3 delphi delphi-2010

如何在下载之前检查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;
Run Code Online (Sandbox Code Playgroud)

jac*_*ate 8

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

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

IdHTTP1.Get(Url, FS, [404]);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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