Скачать файл с FTP-сервера в Lazarus
Мне нужно скачивать файлы с FTP-сервера с помощью Lazarus. У меня уже есть функция для подключения к серверу, но я не знаю, как я могу скачать файлы с него.
Я надеюсь, что кто-то может дать мне пример кода на этот счет.
Подключение к 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 ответа
Вы можете скачать файл через функцию TFTPSend.RetrieveFile
function RetrieveFile(const FileName: string; Restore: Boolean): 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: string): логический;
Обновление Чтобы загрузить все файлы в данном каталоге, вам нужно выполнить цикл, как показано ниже:
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 и т. Д.) Пользователь может заменить или лучше принудительно установить публичный IP-адрес удаленного сервера перед отправкой команды данных на ftp-сервер. Добавив несколько строк кода к классу TFTPSend в модуле ftpsend, мы можем восстановить потерянное соединение для передачи данных. а) Добавьте логическую переменную в защищенную часть класса, например
FForceIP: Boolean;
б) Добавьте логическое свойство к опубликованной части класса, например
property ForceIP: Boolean read FForceIP write FForceIP;
позволяет изменить указанную выше переменную c) При
function TFTPSend.DataSocket: boolean;
после команды
FDSock.CloseSocket;
в пассивном режиме первая часть функции добавляет следующую команду
if FForceIP then FDataIP:=FTargetHost;
который заменяет частный IP-адрес, заданный командой PASV, на IP-адрес удаленного ftp-сервера. г) Чтобы включить принудительный IP-адрес удаленного хоста, просто установите
FTP.Passive:= True;
а также
FTP.ForceIP:= True;
. Канал данных теперь возвращается и работает нормально!