Встала задача передачи файла на сервер. Выбрал FTP протокол. В Delphi есть соответствующие компоненты INDY
IdFTPServer
IdFTP
Но как ими пользоваться? Как их настроить так, чтобы всё работало и выполнялась задача передачи файлов с клиента на сервер?
На официальном сайте я нашёл уже более менее заполненный событиями пример с компонентом IdFTPServer и дописал к нему клиента. В результате удалось передавать файлы, но Касперский блокировал 21 порт и вылетала ошибка
1 |
PORT/EPRT (Active Mode/Extended Active Mode) is not supported. Use PASV/EPSV instead of this |
Решения как минимум 3
-Отключить Касперского
-Настроить Касперского
-Сменить порт с 21, скажем на 22
FTP Сервер
Здесь я подробно останавливаться не буду – поскольку сам ещё во многих вопросах не разобрался, но не скрою – тема интересная.
FTP Клиент
Соединение с FTP сервером и получение папок файлов, выбранной директории
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
procedure TForm2.bConnectClick(Sender: TObject); var SL:TStringList; i: Integer; begin idFTP.Host:='localhost'; //FTP-сервер idFTP.Port:=22; //порт ФТП сервера idFTP.Username:='Логин'; idFTP.Password:='Пароль'; idFTP.Connect; if idFTP.Connected then Caption:='Connected'; idFTP.List; // << Не дружит с Касперским, на 21 порту // Заполняем Memo Memo1.Clear; //for i := 0 to IdFTP.ListResult.Count-1 do //Memo1.Lines.Add(IdFTP.ListResult[i]); // Заполняем имена папок файлов в директории for I := 0 to IdFTP.DirectoryListing.Count-1 do Memo1.Lines.Add(IdFTP.DirectoryListing[i].FileName); end; |
Смена директории
1 2 3 4 5 6 7 8 |
procedure TForm2.bChangeDirClick(Sender: TObject); begin IdFTP.ChangeDir(Edit1.Text); IdFTP.List; FillMemo; end; |
Загрузка файла в директорию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
procedure TForm2.bPutFileClick(Sender: TObject); begin idFTP.MakeDir('/myfiles'); IdFTP.ChangeDir('/files'); if OpenDialog.Execute then begin FFileToPut:=OpenDialog.FileName; idFTP.Put(OpenDialog.FileName); // idFTP.Disconnect; end; end; |
Получение текущей директории
1 2 3 4 5 6 7 8 9 10 |
procedure TForm2.bTestClick(Sender: TObject); begin ShowMessage( IdFTP.RetrieveCurrentDir ); end; |
Как узнать, что файл загрузился?
Обработаем процедуру AfterPut
1 2 3 4 5 6 7 8 9 10 11 |
procedure TForm2.IdFTPAfterPut(Sender: TObject); begin //ShowMessage('After Put'); //ShowMessage(IdFTP.RetrieveCurrentDir); IdFTP.List; FillMemo; if IsSuchFileOnFTPServer(FFileToPut) then ShowMessage('Ok'); end; |
Функция проверки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function TForm2.IsSuchFileOnFTPServer(filename:string):boolean; var i: Integer; s: string; begin filename:=ExtractFileName(filename); Result:=False; for i := 0 to IdFTP.DirectoryListing.Count - 1 do begin if IdFTP.DirectoryListing[i].FileName=filename then Result:=true; end; end; |