【问题标题】:Within Delphi XE6 FTP GET() statement does not return after download finishedDelphi XE6 FTP GET() 语句在下载完成后不返回
【发布时间】:2017-12-17 01:41:36
【问题描述】:

idFTP Indy 组件尝试从我们的服务器下载文件时遇到问题。它下载了 99% 的文件,然后就挂起。 GET 语句不返回。最近发生的所有变化是我们已经从运行 win 8.1 的台式机转移到运行 win10 的笔记本电脑。如果我将进度和完整文件大小写到屏幕上,它会很快下载,直到最后,最后一个字节还没有完成。我要下载的文件是 15,573,350 字节。它达到大约 14MB(相当快)并停止。我试过下载另一个文件,还是一样。

有什么想法吗?

这是代码,没有什么花哨的。我已经从我们的工作应用程序中复制了它来尝试测试它,看看它是否在主项目中。

  with IdFTP1 do
  begin
    Host :=  'xxx';
    Username := 'xxx';
    Password := 'xxx';
    passive := True;
    Connect;
    ChangeDir('Service_Update');
    ChangeDir('QA');
    Self.Caption := Size('jam.zipper').tostring;
    TransferType := ftBinary; //tried with and without
    Get('jam.zipper','jam.zipper',true);
    Button1.Caption := 'Done'; //never gets here
  end;

【问题讨论】:

    标签: delphi ftp windows-10 indy delphi-xe6


    【解决方案1】:

    Get() 可以通过多种方式冻结,正如您所描述的。一些方法包括:

    1. 服务器最后没有关闭传输连接优雅,或者传输完成后服务器没有在命令连接上发送最终的 FTP 响应消息。使用数据包嗅探器进行验证。要处理此问题,请尝试在命令和传输连接上分配非无限 ReadTimeout

    2. 如果 FTP 会话通过不支持 FTP 的路由器/防火墙,则命令连接可能会超时并在长时间传输期间断开。为了处理这个问题,TIdFTP 有一个 NATKeepAlive 属性来在传输期间在命令连接上配置 TCP 保持活动。

    3. 如果您在工作线程中使用 TIdFTP 并带有对 UI 控件进行非同步调用的事件处理程序,这可能会导致各种问题,包括死锁。始终同步对 UI 的访问。

    【讨论】:

    • 谢谢雷米。让我发痒的是服务器没有任何变化。下载功能一直有效 - 直到我现在在 win 10 上发现它不再有效。你认为这会有所作为吗?对于第 3 点,我确实在使用线程。但是我的实际工作代码的行为与我在这里分享的演示相同。它会快速下载所有内容,然后最后什么都不做......
    • 好吧,原来我错了。我恢复赢得 8.1 以重新测试它,这是同样的问题。一定意味着服务器端发生了一些变化,我现在要调查一下......
    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多