Datei hochladen auf FTP-Server mit Indy

Ich bin nicht in der Lage, um eine Datei hochzuladen, um meine 000webhost.com FTP-Server mit Indy für Lazarus. Getestet hab ich die ftp-Konnektivität mit dem Windows-Eingabeaufforderung, und es funktioniert gut. Dies sind meine Einstellungen (IdFTP):

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

- Und dies ist der code, die ich benutze, um meine TIdFTP-Komponente, IdFTP1:

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

wo die variable Token ist deklariert als:

Token: String; 

Bei mir lief das Programm zum ersten mal, es hielt einfrieren und als ich erklärte, dass eine TIdAntiFreeze-Komponente, um zu verhindern, dass Sie einfrieren.
Also, das ist das, was jetzt passiert: manchmal funktioniert das Programm gut, aber es werden keine Dateien auf den server übertragen (Wenn ich versuche, wiederholen Sie den upload, es gibt mir eine EIdAlredyConnected Fehler), und manchmal (wenn ich den code ein wenig, nichts extra) es gibt mir eine EIdProtocolReplyError mit einer seltsamen Nachricht. Ich habe versucht, um die Ausnahme zu fangen und mein Programm, um die Nachricht anzuzeigen, und ich habe einige seltsame Zeichen:

$ £ ï túÁÕÖ îÖõ)€ś K...ÅõÞl%ÇðåÀÁ“§pp

Ein%ßï7!ƒDªÉ[...oˆ_£P*¡°z1K¢H€ÎERPö/

üð΃ç±ïpļƒÏƒ‹Ò1ì

¿Á{»(g{å¥r...Ž1öÐR_JúÑuBûŸ€Œ Pp6oc[JgžÎ¿Èà¦Ä€VJþz'0è–BO@T

Die Antwort sieht wie folgt aus, wenn richtig formatiert:

Datei hochladen auf FTP-Server mit Indy

Konnte ich nicht den formatierten text direkt hier.

Funktioniert der server absolut in Ordnung, die Verzeichnisse, die ich versuche zu laden, sind chmodded auf 777, und ich habe entdeckt, dass die Größe der Datei (die ich hochladen will) ist nicht größer als 3 KBs.

Irgendwelche Ideen?

Durch "Lauschangriff" ich nehme an, du meinst "einfrieren" - da Sie versucht, auf TIdAntiFreeze um es zu lösen?
Ja. Die Schaltfläche, die dem Verfahren zugeordnet ist, blieb in "Geklickt Zustand". Es ist ein TBCButton (Paket BGRAControls). Auch ist die Anwendung nicht mehr reagiert (Wenn ich klickte auf die form, es ist abgestürzt). @JerryDodge
Das ist, weil TIdFTP blockiert den aufrufenden thread, während es damit beschäftigt ist die Arbeit (so wie alle Indy-Komponenten). Wenn der aufrufende thread ist der Haupt-UI-thread, Sie zu verhindern, dass es von der Verarbeitung der neuen Nachrichten in einer fristgerechten Weise, es sei denn, Sie verwenden TIdAntiFreeze. Besser, verschieben den TIdFTP an einen worker-thread statt.
Die Grafik ist egal. TIdAntiFreeze funktioniert Prima. Das ist nicht mein problem. Mein problem ist, dass ich kann immer noch nicht die upload-Arbeit. Verschieben der TIdFTP-Komponente zu einem anderen thread hilft nicht... Und ich habe noch keine Idee, was die Ursache dieser seltsamen Antworten. Anyways, danke für die Anregung.
Verwenden Sie nicht GetCurrentDir() es beruht auf der aufrufende Prozess aktuelle Arbeitsverzeichnis, der Wert ändert sich während des Prozesses das Leben. Wenn die lokale Datei in den app-Ordner verwenden ExtractFilePath(Application.ExeName) statt. In jedem Fall, was Sie gezeigt haben, ist nicht ein FTP-Reaktion, und sicherlich sollte nie erscheinen in einem EIdProtocolReplyError Ausnahme, das macht mich Frage mich, ob Sie tatsächlich mit einem echten FTP-server und nicht etwas anderes.

InformationsquelleAutor TheGreenOmega | 2015-10-09

Schreibe einen Kommentar