2015-10-09 113 views
2

我无法上传文件到我的000webhost.com使用Indy for Lazarus的FTP服务器。我已经用Windows命令提示符测试了ftp连接,并且它工作正常。这些是我的设置(IdFTP):使用Indy将文件上传到FTP服务器

IdFTP1.Host:='shabala.com'; 
IdFTP1.Passive:=True; 
IdFTP1.TransferType:=ftBinary; 
IdFTP1.Username:='******'; 
IdFTP1.Password:='******'; 
IdFTP1.Port:=21; 

这是我用它来打电话给我TIdFTP组件的代码,IdFTP1:

IdFTP1.Connect(True); 
//IdFTP1.ChangeDir('/Sessions'); 
IdFTP1.Put(GetCurrentDir+'\'+Token+'.cmd',Token+'.cmd', False); 
IdFTP1.Quit; 
IdFTP1.Disconnect; 

其中变量Token声明为:

Token: String; 

当我第一次运行该程序时,它保持冷冻状态,我声明了一个TIdAntiFreeze组件以防止它冻结。 所以,这是现在发生的情况:有时程序工作正常,但没有文件传输到服务器(如果我尝试重复上载,它会给我一个EIdAlredyConnected错误),有时(如果我稍微更改代码,没有额外的)它给我一个奇怪的消息EIdProtocolReplyError。我试图捕获异常,并让我的程序,以显示消息,我有一些奇怪的字符:

$£ïtúÁÕÖ100)€¶K...ÅõÞl%ÇðåÀ¨Á“§pp
A%~ßï7!ƒDªÉ[... O_£P *¡°z1K¢ħ€Î¨ERPö/
üð΃ç±ïpļƒÏƒ<Ò1ì
¿A {»(克{A¥ - [R ...Ž¹öÐR_JúѯuBûŸ€ŒPp6o¯ C [JgžÎ¿Èà|Ä€VJþz'0è-`BO @ T

的响应看起来像这样如果正确格式化:

Strange response

我无法直接在此格式化文本。

服务器工作得很好,我试图上传到的目录是chmodded到777,我发现文件的大小(我想上传)不大于3 KB。

任何想法?

+0

通过“窃听”我想你的意思是“冻结” - 因为你试图使用'TIdAntiFreeze'解决呢? –

+0

是的。程序分配给的按钮保持“单击状态”。这是一个TBCButton(包BGRAControls)。此外,应用程序没有响应(如果我点击表单,它崩溃了)。 @JerryDodge – TheGreenOmega

+0

这是因为'TIdFTP'在忙于工作时阻塞调用线程(就像所有Indy的组件一样)。如果调用线程是主UI线程,则可以防止它及时处理新消息,除非使用'TIdAntiFreeze'。最好将'TIdFTP'移动到工作线程。 –

回答

6

多年来,我一直在Indy Ftp上苦苦挣扎。 在某些时候,我从OverbyteIcs (click ICS and then click Download ICS-V8.16 (Apr, 2015))转向另一个(免费)Ftp客户端。 如果你不反对使用免费软件包,下面的代码将做的工作:

uses 
    ... 
    OverbyteIcsFtpCli; 

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; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    FtpLoadFile('rubilaxe.hostoi.com', 
        '******', '******', 
        IncludeTrailingPathDelimiter( 
          ExtractFilePath(Application.ExeName)) +'datafile.zip', 
        '/files' ); 
end;