Delphi Indy FTP EIAcceptTimeout异常
我正在测试IndyFTP以将文件上载到服务器。文件已上载,但有0个字节,因为存在EIdAccessTimeout异常-“接受超时”。如何防止异常?我的代码是否不正确?代码如下所示:Delphi Indy FTP EIAcceptTimeout异常,delphi,delphi-xe4,Delphi,Delphi Xe4,我正在测试IndyFTP以将文件上载到服务器。文件已上载,但有0个字节,因为存在EIdAccessTimeout异常-“接受超时”。如何防止异常?我的代码是否不正确?代码如下所示: procedure TForm1.FTPUpload1Click(Sender: TObject); { Indy FTP Upload. } var iHost: string; iUsername: string; iPassword: string; iFolder: string; iSo
procedure TForm1.FTPUpload1Click(Sender: TObject);
{ Indy FTP Upload. }
var
iHost: string;
iUsername: string;
iPassword: string;
iFolder: string;
iSourceFile: string;
iDestFile: string;
iAppend: boolean;
iStartPos: Int64;
begin
iHost := FTPHost1.Text;
iUsername := Username1.Text;
iPassword := Password1.Text;
iFolder := ServerFolder1.Text;
if FileExists(SourceFile1.Text) then
iSourceFile := SourceFile1.Text
else
Exit;
if FileExists(SourceFile1.Text) then
iDestFile := ExtractFileName(SourceFile1.Text)
else
Exit;
iAppend := False;
iStartPos := -1;
IdFTP1.Host := iHost;
IdFTP1.Username := iUsername;
IdFTP1.Password := iPassword;
IdFTP1.Connect;
IdFTP1.TransferType := ftBinary;
IdFTP1.Put(iSourceFile);
IdFTP1.Disconnect;
end;
列出了一些未使用的VAR,因为我只是在学习,还没有使用一些参数。最可能的情况是,您的FTP客户端设置为活动模式,因此此错误意味着在成功登录FTP服务器后,无法建立“反向”连接(文件传输) 在活动模式下,FTP客户端从随机的非特权端口连接 (N>1023)到FTP服务器的命令端口,端口21。然后,客户端 开始侦听端口N+1并将FTP命令端口N+1发送到 FTP服务器。然后服务器将连接回客户端的 从其本地数据端口(即端口20)指定的数据端口 您可以通过以下方式设置为被动模式:
IdFTP1.Passive := True;
编辑
此外,请使用try-except-finally块,以便您可以执行一些错误处理。例如:
try
IdFTP1.Connect;
try
IdFTP1.Put(...);
finally
IdFTP1.Disconnect;
end;
except
// couldn't connect
end;
谢谢Peter。一旦我添加了IdFTP1.Passive:=True,文件上传正确。try finally块是否在Connect和Put附近?Connect会引发异常,因此它必须位于try块内。从技术上讲,Put也会引发异常(当目标文件名为空时)而且它也应该是安全的。此外,如果Connect引发E,则会自动调用Disconnect。最后,在成功发送传输操作的内容后,会调用AfterPut事件处理程序。如果使用
try/Finally
关闭连接,请将Connect()放入
在尝试之前
并将断开连接()
放在最后
中。不要将连接()
放在尝试
中。如果连接()
引发异常,则无需调用断开连接()
在内部处理该问题。如果Put()
引发异常,则只需调用Disconnect()
。如果改用try/except
,则将Connect()
放在try
内部是有意义的。谢谢Remy,我使用了后一个try/except块。