从 FTP-Lazarus 的服务器下载文件
Download File from FTP-Server in 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;
您可以通过 TFTPSend.RetrieveFile 功能下载文件
function RetrieveFile(const FileName: string; Restore: Boolean):
Boolean; virtual;
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:
string): Boolean;
更新
要下载给定目录中的所有文件,您需要执行如下循环:
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 了解更多信息。
如果命令 PASV(当 FTP.Passive:=true
)错误地返回到远程服务器防火墙配置中的私有地址会怎样?例如“227 进入被动模式 (192,168,148,37,129,44)”。我们收到错误 425 无法打开数据连接!
我正在使用 synapse 4.0 和 Lazarus 2.0.10。在最著名的 ftp 客户端(filezilla、winscp 等)中,用户可以在向 ftp 服务器发送数据命令之前替换或更好地强制远程服务器的 public ip。在 Class TFTPSend 单元 ftpsend 中添加少量代码行,我们可以重新建立丢失的数据连接。
a) 将布尔变量添加到 class 的受保护部分,例如 FForceIP: Boolean;
b) 添加布尔值 属性 到 class 的已发布部分,例如 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;
。 ▼数据通道正在恢复并正常运行!
我需要使用 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;
您可以通过 TFTPSend.RetrieveFile 功能下载文件
function RetrieveFile(const FileName: string; Restore: Boolean): Boolean; virtual;
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: string): Boolean;
更新 要下载给定目录中的所有文件,您需要执行如下循环:
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 了解更多信息。
如果命令 PASV(当 FTP.Passive:=true
)错误地返回到远程服务器防火墙配置中的私有地址会怎样?例如“227 进入被动模式 (192,168,148,37,129,44)”。我们收到错误 425 无法打开数据连接!
我正在使用 synapse 4.0 和 Lazarus 2.0.10。在最著名的 ftp 客户端(filezilla、winscp 等)中,用户可以在向 ftp 服务器发送数据命令之前替换或更好地强制远程服务器的 public ip。在 Class TFTPSend 单元 ftpsend 中添加少量代码行,我们可以重新建立丢失的数据连接。
a) 将布尔变量添加到 class 的受保护部分,例如 FForceIP: Boolean;
b) 添加布尔值 属性 到 class 的已发布部分,例如 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;
。 ▼数据通道正在恢复并正常运行!