【发布时间】:2021-03-25 09:21:12
【问题描述】:
我有以下代码检查网站上是否存在文件。有时它有效,有时则无效。当它不起作用时,它会调用 EIdHTTPProtocolException 并返回 0,即使该文件存在于服务器上。有谁知道为什么它并不总是有效?如果我在调试代码,它似乎更有可能工作,所以我想知道它是否与时间有关?
这是一个在 Windows 上运行的 FMX 应用程序,我使用的是 Delphi 10.4。
请注意,我已将链接更改为假链接,以便在此处发布,因此很明显,如果您尝试,下面的代码将始终返回 0。
uses IdHTTP, IdStack;
function CheckFileOnlineExists(const OnlineFile: string; var Size: Int64): Byte;
var
IdHttp: TIdHTTP;
begin
Result := 0; // File not found
IdHttp := TIdHTTP.Create(nil);
try
try
IdHttp.Head(OnlineFile);
Size := IdHttp.Response.ContentLength;
if Size > 0 then Result := 2; // File found
except
on E: EIdHTTPProtocolException do ;
on E: EIdSocketError do Result := 1; // No internet
end;
finally
IdHttp.Free;
end;
end;
procedure TMainForm.FormActivate(Sender: TObject);
Var
LSize : Int64;
LRes : Byte;
begin
// Check if online file exists
LRes := CheckFileOnlineExists('http://websiteurl.com/file_test.png', LSize);
if (LRes <> 2) or (LSize <> 5497) then begin
if LRes = 0 then
Caption := 'Website check file not found. This app will close'
else
Caption := 'Internet connection is needed to run this application';
Close;
end;
end;
【问题讨论】:
-
我建议你捕获流量(例如使用 WireShark),看看它什么时候不起作用,至少 HTTP 协议有什么问题。也许服务器在文件完全发送之前就放弃了连接?
-
@fpiette 这是一个 HEAD 请求,它不发送文件,只是一些关于它的信息。这是非常短的通信,因此预计不会(经常)失败。
-
也许我应该使用一个 while 循环来继续检查,直到它成功或达到 10 之类的最大计数。
-
如果文件不存在,服务器应该给你一个404,它是有效的文件存在大小为零。至于为什么会出现协议错误,我建议您遵循@fpiette 的建议并检查实际的http 对话以了解发生了什么。
-
就像@RobLambden 写道:您还需要检查HTTP status:200 是一个强指标,但404 和410 也是。您甚至无法确定 301 和 307 是否会自动跟随新的 URI,更不用说如果没有给出该状态会发生什么。内容长度也不是自动成为您期望的“文件”之一 - 它也可能是自定义 404 页面的大小。
标签: delphi firemonkey