我正在测试 IndyFTP 将文件上传到服务器。这文件已上传但有 0 字节因为出现了 EIdAccessTimeout 异常 - 'Accept timed out'。我该如何防止该异常?我的代码是否不正确?代码如下所示:
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;
列出了一些未使用的变量,因为我刚刚学习并且还没有使用某些参数。
最有可能的是,您的 FTP 客户端设置为 ACTIVE 模式,因此此错误意味着成功登录 FTP 服务器后,无法建立“反向”连接(文件传输)。
在主动模式 FTP 中,客户端从随机非特权端口进行连接
(N > 1023) 到 FTP 服务器的命令端口,端口 21。然后,客户端
开始监听端口 N+1 并向端口 N+1 发送 FTP 命令
FTP 服务器。然后服务器将连接回客户端
从其本地数据端口指定数据端口,即端口 20。
主动 FTP 与被动 FTP,权威解释 http://slacksite.com/other/ftp.html
您可以通过以下方式设置为被动模式:
IdFTP1.Passive := True;
EDIT
此外,使用 try- except-finally 块,这样您就可以进行一些错误处理。就像是:
try
IdFTP1.Connect;
try
IdFTP1.Put(...);
finally
IdFTP1.Disconnect;
end;
except
// couldn't connect
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)