【问题标题】:Indy FTP Failing to upload miserablyIndy FTP 上传失败
【发布时间】:2012-01-09 05:54:02
【问题描述】:

使用简单的代码,如:

  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;

我得到以下结果:

  • 上传时应用程序冻结(因此无法查看进度条位置)。
  • 上传的文件损坏(损坏的内容超过几个字节)。

我到底做错了什么?

谢谢。

【问题讨论】:

  • Put 有 2 个参数,据我所知,一个是源文件,另一个是目标文件。
  • 草案(如果 Delphi 版本足够现代以支持 OTL)stackoverflow.com/questions/15788262 AsyncCalls lib 也可能用于旧版 Delphi 版本

标签: delphi ftp indy


【解决方案1】:

应用程序冻结,因为 Indy 使用了阻塞操作。在代码运行时,主消息循环没有运行,因此在cxButton1Click() 退出之前不会处理新消息。要解决这个问题,要么将 TIdAntiFreeze 组件放在 TForm 上,要么将 TIdFTP 代码移动到单独的工作线程,然后在需要时使用 TIdSyncTIdNotify 安全地更新 UI。

如果您以 ASCII 模式而不是二进制模式传输文件,该文件将被“损坏”。确保TIdFTP.TransferType 属性设置为ftBinary。 Indy 9 及更早版本默认为 ftBinary,但 Indy 10 默认为 ftASCII(以匹配 FTP 协议规范)。

【讨论】:

  • 干得好。将其设置为线程并更改为二进制文件就像一个魅力。抓住这一点,谢谢。
猜你喜欢
  • 2015-06-22
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多