Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Indy FTP EIAcceptTimeout异常_Delphi_Delphi Xe4 - Fatal编程技术网

Delphi Indy FTP EIAcceptTimeout异常

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

我正在测试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;

列出了一些未使用的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块。