首页
学习
活动
专区
圈层
工具
发布

Indy异常
EN

Stack Overflow用户
提问于 2014-08-26 14:49:41
回答 1查看 1.9K关注 0票数 2

我正在测试IndyFTP将一个文件上传到服务器。文件已上载,但有0字节,因为有EIdAccessTimeout异常--“接受超时”。如何防止异常?我的代码不正确吗?代码如下所示:

代码语言:javascript
复制
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列出,因为我只是学习,还没有使用一些参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-26 16:36:41

很可能,FTP客户端被设置为活动模式,因此此错误意味着在成功登录到FTP服务器后,无法建立“反向”连接(文件传输)。

在活动模式FTP中,客户端从随机的非特权端口(N > 1023)连接到FTP服务器的命令端口(端口21 )。然后,客户端开始侦听端口N+1,并将FTP命令端口N+1发送到FTP服务器。然后,服务器将从本地数据端口(即端口20 )连接回客户端指定的数据端口。

主动FTP和被动FTP,一个明确的解释

您可以这样设置为被动模式:

代码语言:javascript
复制
IdFTP1.Passive := True;

编辑

此外,使用try-除了最后块,以便您可以进行一些错误处理。类似于:

代码语言:javascript
复制
  try
    IdFTP1.Connect;
    try
      IdFTP1.Put(...);
    finally
      IdFTP1.Disconnect;
    end;
  except
    // couldn't connect
  end;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25508827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档