Delphi ICS загрузить на FTP - PullRequest
       1

Delphi ICS загрузить на FTP

0 голосов
/ 25 сентября 2018

Я могу загрузить любой файл, но только TXT и CSV загружать правильно, любые другие файлы загружаются, но он поврежден.Что я делаю неправильно?Вот мой код.СПАСИБО!!!:)

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;

1 Ответ

0 голосов
/ 25 сентября 2018

Для свойства Binary установлено значение True, но вы фактически не переводите сеанс FTP в двоичный режим на стороне сервера, поэтому файлы передаются в режиме ASCII (режим протокола FTP по умолчанию), что приводит к повреждению двоичных файлов..

После установки свойства Binary вам необходимо вызвать метод TypeSet() (или вы можете использовать метод TypeBinary() или TypeAscii()), чтобы сообщить серверу FTP, какой режим использовать,перед тем, как выполнять переводы в этом режиме:

FTP.Binary := ...;
...
if not FTP.TypeSet then
  raise Exception.Create('Failed to set transfer type: ' + FTP.ErrorMessage);

Это указано в документации ICS:

http://wiki.overbyte.eu/wiki/index.php/TFtpClient.Binary

Свойство, используемое для установкиФайлы передаются в двоичном или ASCII-режиме.Binary не действует до тех пор, пока TypeSet или TypeSetAsync не будут успешно вызваны.

TypeSetBinary, TypeSetBinaryAsync, TypeSetAscii и TypeAsciiAsync могут выполнить этишаги в один звонок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...