Indy FTP上传失败

5

使用简单的代码,例如:

  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个参数,一个是源文件,另一个是目标文件。 - opc0de
草案(如果Delphi版本足够现代以支持OTL)在http://stackoverflow.com/questions/15788262。对于旧版的Delphi,也可以使用AsyncCalls库。 - Arioch 'The
1个回答

16
应用程序冻结可能是由于Indy使用阻塞操作。当代码运行时,主消息循环不会运行,因此直到cxButton1Click()退出之前,新消息都没有被处理。要解决这个问题,可以将TIdAntiFreeze组件放置在TForm上,或者将TIdFTP代码移动到单独的工作线程中,然后使用TIdSyncTIdNotify在需要时安全地更新UI。
如果你以ASCII模式而不是二进制模式传输文件,它将会出现“损坏”。确保TIdFTP.TransferType属性设置为ftBinary。Indy 9及更早版本默认为ftBinary,但Indy 10默认为ftASCII(以匹配FTP协议规范)。

干得好。将其设置为线程并转换为二进制代码非常成功。拿走这个应得的分数,谢谢。 - John Rosenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接