从Lazarus的FTP服务器下载文件

时间:2018-07-16 13:28:14

标签: delphi lazarus

我需要使用Lazarus从FTP服务器下载文件。我已经具有连接服务器的功能,但是不知道如何从服务器下载文件。

我希望有人能给我一个有关此示例的代码。

连接到FTP服务器:

function connect(Host, Username, Password : string) : boolean;
var
FTP: TFTPSend;
begin
FTP := TFTPSend.Create;

FTP.TargetHost := Host;
FTP.TargetPort := Port;
FTP.AutoTLS := true;
FTP.Username := username;
FTP.Password:= Password;
FTP.Login;

2 个答案:

答案 0 :(得分:4)

您可以通过TFTPSend.RetrieveFile函数下载文件

  

function RetrieveFile(const FileName:string; Restore:Boolean):   布尔值虚拟的;

var
 FTP: TFTPSend;
begin
  FTP := TFTPSend.Create;
  try
    ....
      FTP.DirectFileName := LocalPath;
      FTP.DirectFile     := True;
      FTP.RetrieveFile(RemotePath, True);
    ....
  finally
    FTP.Free;
  end;
end;

您还可以使用此功能FtpGetFile

  

function FtpGetFile(const IP,Port,FileName,LocalFile,User,Pass:   字符串):布尔值;


更新 要下载给定目录中的所有文件,您需要执行以下循环:

  FTP.DirectFile:=True;
  if FTP.List('', False) then
    for I := 0 to FTP.FtpList.Count-1 do begin
        FTP.DirectFileName := FTP.FtpList[I].FileName;
        FTP.RetrieveFile(FTP.FtpList[I].FileName, True);
    end;        

检查TFTPSend.List以获得更多信息。

答案 1 :(得分:0)

如果在远程服务器防火墙配置中错误地将命令 PASV(当 FTP.Passive:=true)返回到私有地址会发生什么?例如'227 进入被动模式 (192,168,148,37,129,44)'。我们收到错误 425 无法打开数据连接! 我正在使用突触 4.0 和 Lazarus 2.0.10。在大多数著名的 ftp 客户端(filezilla、winscp 等)中,用户可以在向 ftp 服务器发送数据命令之前替换或更好地强制远程服务器的公共 ip。通过在单元 ftpsend 中向类 TFTPSend 添加少量代码行,我们可以重新建立丢失的数据连接。 a) 将布尔变量添加到类的受保护部分,例如 FForceIP: Boolean; b) 将布尔属性添加到类的已发布部分,例如 property ForceIP: Boolean read FForceIP write FForceIP; 允许更改上述变量 c) 在被动模式下的命令 function TFTPSend.DataSocket: boolean; 之后的 FDSock.CloseSocket; 函数的第一部分添加以下命令 if FForceIP then FDataIP:=FTargetHost;,将 PASV 命令给出的私有 IP 替换为远程 ftp 服务器的 IP。 d) 要启用强制远程主机 IP 地址,只需设置 FTP.Passive:= True;FTP.ForceIP:= True;。数据通道现已恢复正常运行!