我需要使用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;
答案 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;
。数据通道现已恢复正常运行!