Загрузка файлов на FTP-сервер в Delphi может стать головной болью, если файлы загружаются некорректно или повреждены. Одной из распространенных проблем является загрузка бинарных файлов, таких как executables, images, или архивы, которые загружаются, но становятся непригодными для использования из-за повреждений. В этой статье мы рассмотрим типичную проблему, с которой сталкиваются разработчики, и предоставим решение, которое поможет вам диагностировать и устранить проблему.
Проблема:
При загрузке файлов на FTP-сервер с помощью компонента TFtpClient в Delphi, некоторые файлы (например, TXT и CSV) загружаются корректно, в то время как другие файлы (любые другие типы файлов) загружаются, но становятся поврежденными. Код для загрузки файлов на FTP-сервер выглядит следующим образом:
procedure FtpUploadFile(
HostName: String;
UserName: String;
Password: String;
UploadFileName: String;
ToHostDir: String);
var
FTP: TFtpClient;
begin
FTP := TFtpClient.Create(nil);
try
FTP.HostName := HostName;
FTP.Passive := True;
FTP.Binary := True;
FTP.Username := UserName;
FTP.Password := Password;
FTP.Port := '21';
if not FTP.Open then
raise Exception.Create('Failed to connect: ' + FTP.ErrorMessage);
if (not FTP.User) or (not FTP.Pass) then
raise Exception.Create('Failed to login: ' + FTP.ErrorMessage);
FTP.HostDirName := ToHostDir;
if not FTP.Cwd then
raise Exception.Create('Failed to change dir: ' + FTP.ErrorMessage);
FTP.LocalFileName := UploadFileName;
FTP.HostFileName := ExtractFileName(UploadFileName);
if not FTP.Put then
raise Exception.Create('Failed to upload file: ' + FTP.ErrorMessage);
finally
FTP.Free;
end;
end;
Решение:
Проблема заключается в том, что вы установили свойство Binary в True, но не переключили сеанс FTP на серверной стороне в бинарный режим. По умолчанию FTP использует ASCII-режим для передачи файлов, что приводит к повреждению бинарных файлов.
Чтобы решить эту проблему, вам нужно вызвать метод TypeSet (или TypeBinary или TypeAscii), чтобы указать FTP-серверу, какой режим использовать, перед проведением передачи в этом режиме:
FTP.Binary := True;
...
if not FTP.TypeSet then
raise Exception.Create('Failed to set transfer type: ' + FTP.ErrorMessage);
Свойство используется для установки того, передаются ли файлы в бинарном или ASCII режиме. Binary не имеет эффекта, пока не были успешно вызваны TypeSet или TypeSetAsync.
TypeSetBinary, TypeSetBinaryAsync, TypeSetAscii, и TypeAsciiAsync могут выполнять эти шаги в одном вызове.
Используя это решение, вы должны убедиться, что файлы загружаются на FTP-сервер без повреждений, независимо от их типа.
Статья посвящена решению проблемы повреждения бинарных файлов при загрузке на FTP-сервер с помощью компонента TFtpClient в Delphi, и предлагает диагностировать и устранить проблему путем переключения сеанса FTP на серверной стороне в бинарный ре
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.