Delphi ICS上传到FTP

时间:2018-09-25 20:33:15

标签: delphi ftp

我可以上传任何文件,但是只有TXT和CSV可以正确上传,其他任何文件都可以上传,但是文件已损坏。我究竟做错了什么?这是我的代码。谢谢!!! :)

procedure FtpUploadFile( 
  HostName: String;
  UserName: String;
  Password: String;
  UploadFileName: String;
  ToHostDir : String );
var
  FTP: TFtpClient;
begin
  FTP := TFtpClient.Create(nil);
  try
    FTP.HostName := HostName;
    FTP.Passive := True;
    FTP.Binary := True;
    FTP.Username := UserName;
    FTP.Password := Password;
    FTP.Port := '21';

    if not FTP.Open then
      raise Exception.Create('Failed to connect: ' + FTP.ErrorMessage);

    if (not FTP.User) or (not FTP.Pass) then
      raise Exception.Create('Failed to login: ' + FTP.ErrorMessage);

    FTP.HostDirName := ToHostDir;
    if not FTP.Cwd then
      raise Exception.Create('Failed to change dir: ' + FTP.ErrorMessage);

    FTP.LocalFileName := UploadFileName;
    FTP.HostFileName := ExtractFileName(UploadFileName);

    if not FTP.Put then
      raise Exception.Create('Failed to upload file: ' + FTP.ErrorMessage);
  finally
    FTP.Free;
  end;
end;

1 个答案:

答案 0 :(得分:2)

您正在将Binary属性设置为True,但是实际上并没有在服务器端将FTP会话置于二进制模式,因此文件以ASCII模式(FTP协议的默认模式)传输,这会损坏二进制文件。

设置Binary属性后,您需要调用TypeSet()方法(或者,可以使用TypeBinary()TypeAscii()方法)来告诉FTP服务器哪个模式,然后再以该模式执行传输:

FTP.Binary := ...;
...
if not FTP.TypeSet then
  raise Exception.Create('Failed to set transfer type: ' + FTP.ErrorMessage);

这在ICS的文档中有很多说明:

http://wiki.overbyte.eu/wiki/index.php/TFtpClient.Binary

  

用于设置是以二进制还是ASCII模式传输文件的属性。 Binary在成功调用TypeSetTypeSetAsync之前无效。

     

TypeSetBinaryTypeSetBinaryAsyncTypeSetAsciiTypeAsciiAsync可以在一个呼叫中执行这些步骤。