При работе с FTP-серверами в Delphi и Pascal может возникнуть проблема, когда вы не можете загрузить файлы на сервер, хотя подключение к нему происходит успешно. В этой статье мы рассмотрим, как решить эту проблему, используя компонент TIdFTP из пакета Indy.
Описание проблемы
Распространенная ситуация, когда администратор предоставляет вам ссылку на FTP-сервер в формате ftp://имя_пользователя@хост/путь/, а вы не можете загружать файлы на сервер, используя код на Delphi или Pascal. В этом случае вы можете успешно подключиться к серверу, но при попытке загрузить файл получаете ошибку "illegal port command".
Пример кода
Ниже приведен пример кода, который демонстрирует типичную ситуацию, когда вы не можете загрузить файл на FTP-сервер:
var
ftp: TIdFTP;
begin
ftp := TIdFTP.Create(nil);
try
ftp.Host := '119.xxx.xxx.133';
ftp.Username := 'fnc';
ftp.Password := 'fnc';
ftp.Port := 21;
ftp.ConnectTimeout := 5000;
ftp.Connect;
// При попытке загрузить файл здесь вы получите ошибку "illegal port command"
ftp.Put('C:\ temp\file.txt', 'file.txt');
finally
ftp.Free;
end;
end;
Решение проблемы
Чтобы решить проблему, вам нужно правильно настроить компонент TIdFTP, извлекая информацию из предоставленной FTP-ссылки. Вот пример кода, который демонстрирует правильный способ подключения к FTP-серверу и загрузки файла:
var
URL: string;
Uri: TIdURI;
ftp: TIdFTP;
begin
URL := 'ftp://fnc:fnc@119.xxx.xxx.133/Files/'; // Ваша FTP-ссылка
Uri := TIdURI.Create(URL);
try
ftp := TIdFTP.Create(nil);
try
ftp.Host := Uri.Host;
if Uri.Port <> '' then
ftp.Port := StrToInt(Uri.Port)
else
ftp.Port := 21;
ftp.Username := Uri.Username;
ftp.Password := Uri.Password;
ftp.ConnectTimeout := 5000;
ftp.Connect;
if Uri.Path <> '/' then
ftp.ChangeDir(Uri.Path);
ftp.Put('C:\ temp\file.txt', 'file.txt');
finally
ftp.Free;
end;
finally
Uri.Free;
end;
end;
В этом примере мы создаем объект TIdURI и передаем ему FTP-ссылку. Затем мы извлекаем информацию о хосте, порте, имени пользователя и пароле из объекта TIdURI и назначаем их соответствующим свойствам компонента TIdFTP. После успешного подключения к серверу мы меняем текущую директорию на указанную в FTP-ссылке и загружаем файл.
Альтернативное решение
Если вы все равно испытываете проблемы с загрузкой файлов на FTP-сервер, попробуйте установить свойство Passive компонента TIdFTP в True. Это может помочь решить проблему, если ваш FTP-сервер требует пассивного режима передачи данных.
ftp.Passive := True;
Заключение
В этой статье мы рассмотрели проблему подключения к FTP-серверу через Delphi и Pascal и предложили решение, которое включает правильную настройку компонента TIdFTP на основе предоставленной FTP-ссылки. Мы также рассмотрели альтернативное решение, которое может помочь, если ваш FTP-сервер требует пассивного режима передачи данных. Используйте эти решения, чтобы эффективно работать с FTP-серверами в ваших проектах на Delphi и Pascal.
Статья о решении проблемы подключения к FTP-серверу через Delphi и Pascal с использованием компонента TIdFTP из пакета Indy.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.