Indy FTP Неудачно загрузить - PullRequest
4 голосов
/ 30 ноября 2011

Используя простой код, такой как:

  procedure TForm1.cxButton1Click(Sender: TObject);
  begin
  ftp.Host := 'domain';
  ftp.Username := 'user';
  ftp.Password := 'password';
  ftp.Connect;
  ftp.Put('C:\_Projects\testpicture.JPG');
  ftp.Quit;
  ftp.Disconnect;
  end;

Я получаю следующие результаты:

  • При загрузке приложение зависает (возможно, он не видит позицию индикатора выполнения).
  • Загруженный файл поврежден (поврежден больше, чем на несколько байтов).

Что, черт возьми, я делаю не так?

Спасибо.

1 Ответ

13 голосов
/ 30 ноября 2011

Приложение зависает, потому что Indy использует операции блокировки.Пока код выполняется, основной цикл сообщений не работает, поэтому новые сообщения не обрабатываются до тех пор, пока не завершится cxButton1Click().Чтобы решить эту проблему, либо поместите компонент TIdAntiFreeze в TForm, либо переместите код TIdFTP в отдельный рабочий поток, а затем используйте TIdSync или TIdNotify для безопасного обновления пользовательского интерфейса при необходимости.

Файл будет «поврежден», если вы переносите его в режиме ASCII, а не в двоичном режиме.Убедитесь, что для свойства TIdFTP.TransferType установлено значение ftBinary.Для Indy 9 и более ранних версий по умолчанию установлено значение ftBinary, но для Indy 10 по умолчанию используется значение ftASCII (в соответствии со спецификациями протокола FTP).

...