Скачать файл с 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;. Канал данных теперь возвращается и работает нормально!

Другие вопросы по тегам