我正在测试IndyFTP将一个文件上传到服务器。文件已上载,但有0字节,因为有EIdAccessTimeout异常--“接受超时”。如何防止异常?我的代码不正确吗?代码如下所示:
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;有一些未使用的vars列出,因为我只是学习,还没有使用一些参数。
发布于 2014-08-26 16:36:41
很可能,FTP客户端被设置为活动模式,因此此错误意味着在成功登录到FTP服务器后,无法建立“反向”连接(文件传输)。
在活动模式FTP中,客户端从随机的非特权端口(N > 1023)连接到FTP服务器的命令端口(端口21 )。然后,客户端开始侦听端口N+1,并将FTP命令端口N+1发送到FTP服务器。然后,服务器将从本地数据端口(即端口20 )连接回客户端指定的数据端口。
主动FTP和被动FTP,一个明确的解释
您可以这样设置为被动模式:
IdFTP1.Passive := True;编辑
此外,使用try-除了最后块,以便您可以进行一些错误处理。类似于:
try
IdFTP1.Connect;
try
IdFTP1.Put(...);
finally
IdFTP1.Disconnect;
end;
except
// couldn't connect
end;https://stackoverflow.com/questions/25508827
复制相似问题