-2

我有一个简单的问题。我使用德尔福 2010。

我的软件中有一个 FTP 客户端。当我使用基于 IIS 的 FTP 时,它可以正常工作

我上周更换了我的 FTP 服务器。现在我有一个带有 ProFTPD 的 Linux 服务器。

当我使用这个 FTP 服务器时,它可以工作,但它会下载损坏的文件。

我注意到使用函数 idFTP.Size 返回 -1 的调试器。因此,我使用大小编号,当我 idFTP.list 文件时由 Indy FTP 目录解析器返回。使用这种方式,文件以损坏的状态下载。

但是,使用其他 FTP 程序,文件下载正常。

with idFTP1 do
begin
 AutoLogin := False;
 IPVersion := Id_IPv4;
 Passive := True;
 TryNATFastTrack := true;
 Port := 21;
 Host := '192.168.121.221';
 Username := 'flxupgrader';
 Password := 'avaricia';
 Connect;
 login;
 TransferType := ftBinary;
 BeginWork(wmRead);
 Get('/_Enterprise/141010.zip',
    'E:\Usuarios\Pablo\141010.zip');
 EndWork(wmRead);
 Disconnect;
end;

当我使用带有 ProFTP FTP 服务器的 Linux 中的 FTP 服务器执行此代码时,我的 ZIP 下载已损坏。您无法从中提取任何内容,“CRC 错误”。

重要提示:使用 Windows 资源管理器访问 FTP 服务器以下载文件:它工作正常。该文件为 24525K。使用我的 Indy 10 程序下载该文件,下载的文件为 24616K,并且已损坏。

4

1 回答 1

0

TIdFTP.Size()在以下任一情况下返回 -1:

  1. FTP 服务器报告该SIZE命令的除 213 以外的任何回复代码。

  2. FTP 服务器上报回复码 213,但其回复文本无法解析为Int64.

话虽如此,Size()严格要求用户在需要时调用。 TIdFTP本身根本不使用Size(),在实际转账中没有任何作用。 在发送命令之前将属性Size()设置为,然后在需要时恢复以前的值。例如,某些 FTP 服务器不允许使用ASCII 模式的命令。TransferTypeftBinarySIZESIZE

传输文件时,您必须确保使用正确TransferType的文件类型。您的“损坏”文件大于源文件这一事实表明您正在以 ASCII 模式传输文件(这是默认类型,根据 FTP 规范),因此在传输过程中将裸字节CRLF字节八位字节转换为CRLF序列. 只有文本文件才应该以 ASCII 模式传输,并且只有在跨平台换行是一个问题时。其他任何东西都应该以 BINARY 模式传输,因此字节八位字节按原样传输。

于 2014-10-14T18:48:08.893 回答