Недавно писал себе программулину, сливающую резервные копии с фтп сервера на локальный тазик, и пришлось сесть подразобраться с Indy компонентом idFTP.
Для начала на форму выкинем кнопку, об зовем ее Download, и компонент idFTP из закладки Indy Clients, должно получиться нечто похожее на постер к посту (см. выше 😉 )
Чтож, полпути пройдено, теперь в обработчике событий для нажатия кнопки пишем следующий код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
idFTP.Username:= 'backuper';
idFTP.Password:= 'xxxxxxxxxxxxx';
idFTP.Host:= 'ip_ftp_servera';
idFTP.Passive:= True;
if idFTP.Connected then
begin
idFTP.Disconnect;
try
idFTP.Connect(True);
except
on E : Exception do
ShowMessage('Ошибка подключения: '+E.Message);
end;
if idFTP.Connected then
try
idFTP.Get('test.rar', 'c:/temp/test.rar', True);
except
on E : Exception do
ShowMessage('Ошибка скачивания файла: '+E.Message);
end;
end
else
try
idFTP.Connect(True);
except
on E : Exception do
ShowMessage('Ошибка подключения: '+E.Message);
end;
if idFTP.Connected then
try
idFTP.Get('test.rar', 'c:/temp/test.rar', True);
except
on E : Exception do
ShowMessage('Ошибка скачивания файла: '+E.Message);
end;
end;
В двух словах по коду:
проверяем подключен ли компонент к серверу, если подключен, то отключаем и подключаемся по новой, если не удается подключиться, вылетит сообщение, с описанием ошибки, после пробуем слить файл test.rar, опять же, если что-то не получается, то снова вылетит месага об ошибочке.
Если возникли вопросы по коду, или необходимо просто помочь, буду рад оказать содействие )))))
15 комментариев. Оставить новый
Перед коннектом нужно обязательно задать следующее:
TransferType := ftBinary;
Иначе двоичные файлы будут скачиваться с искажением.
Все бы хорошо, о если в имени файла есть кирилица — то не работает. Как быть?
У меня Antivir Personal после дополнения этого куска кода сразу выдаёт Троян якобы TR/ATRAPS.Gen и хрен запустишь прогу пока не отрубишь антивир. Опять же, если у пользователя тот же AntiVir стоит будут такие же вилы! Значит надо искать другие варианты обновлений… а то нет универсальности решения. Странно, конечно какого лешего Антивир фигнёй страдает на такой безобидный код, но блин не айс получается в плане реализации закачки.
Согласен, а более адекватные антивирусы что говорят?
На делфях уже сто лет не кодил 🙂
И это лишнее. Вот так надо (Delphi XE5):
procedure Form1.acReloadExecute(Sender: TObject);
begin
idFTP1.Username:= ‘backuper’;
idFTP1.Password:= ‘xxxxxxxxxxxxx’;
idFTP1.Host:= ‘ip_ftp_servera’;
idFTP1.Passive:= True;
idFtp1.AutoLogin:=True;
if idFTP1.Connected then idFTP1.Disconnect;
try
idFTP1.Connect();
except
on E : Exception do
ShowMessage(‘Ошибка подключения: ‘+E.Message);
end;
if idFTP1.Connected then try
idFTP1.Get(‘test.rar’, ‘c:/temp/test.rar’, True);
except
on E : Exception do
ShowMessage(‘Ошибка скачивания файла: ‘+E.Message);
end;
end;
вообще, этоn блок можно вынести в отдельную функцию
try
idFTP.Connect(True);
except
on E : Exception do
ShowMessage(‘Ошибка подключения: ‘+E.Message);
end;
if idFTP.Connected then
try
idFTP.Get(‘test.rar’, ‘c:/temp/test.rar’, True);
except
on E : Exception do
ShowMessage(‘Ошибка скачивания файла: ‘+E.Message);
end;
и вызывать когда нужно, перепишу потом, главное что суть ясна
ну смотри: ты выставил все параметры для соединения, потом проверяешь: если соединен — разорвать соединение, иначе скачать файл (со всеми обработками).
Говоря точнее, надо бы убрать else и один end; в конце. Тогда проверка на соединение отработает и скачивание произойдет. В любом случае спасибо, этот пример взял для работы над своим приложением 🙂
Поправил в коде, добавил переподключение, если уже подключены 🙂
Немного не так, не сработает при втором жмакании на кнопку, т.к. компонент просто отключится от сервера 🙂
А при первом жмакании, он проверит, подключены мы или нет к севраку, если подключены, от отключаемся, если нет, то конектимся и выкачиваем то что нас интересует.
Опять же, это просто пример, возможно немного неудачно я проверкой подключения сделал, но тут уже проверка на гика)))))
нене, если не убрать этот if, то else не сработает при первом запуске, когда процесс не соединен с сетью.
Эм, у каждого свои подходы к программированию, ну убери, и не обрабатывай исключение, если твой компонент уже будет подключен, все в твоих руках))))))
>idFTP.Disconnect
>else
>try
Я бы это else убрал, без нее действительно будет работать 🙂
А в конце, для чистоты кода я бы сделал
idFTP.Disconnect;
Перепроверь логин пароль, тебе четко указало ошибку
‘Login or password incorrect!’.
попробуй копипастом в тотале те данные что используешь в проге
Не работает… Пишет Project Run.exe raised exception class EIdReplyRFCError with message ‘Login or password incorrect!’. Хотя брэндмауэр выключен, антивируса нет, а пользователь есть такой для входа на фтп. с тотала захожу без проблем