2015-10-09 114 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;