Entwickler-Ecke
Internet / Netzwerk - idFTP-Client erstellen
Flux89 - Sa 28.01.12 19:01
Titel: idFTP-Client erstellen
Hallo Forum!
Ich moechte einen FTP-Client in Delphi (+Indy-Komponenten) erstellen. Als Testplattform dient mir zunächst nur mein eigener PC (Filezilla Server (ein Benutzer mit vollen Rechten ist eingerichtet)).
Auch wenn ich schon ein paar Delphi-Tutorials hinter mir habe, bin ich noch absoluter Delphi Neuling.
geplantes Vorgehen:
Neue Form oeffnen und idFTP draufziehen. Nach Eingabe der Attribute (also user, password, host ip,...) mit den Methoden connect, put, disconnect die grundsaetzliche Funktionalitaet testen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP;
type TForm1 = class(TForm) IdFTP1: TIdFTP;
procedure transfertest; private public end;
implementation
{$R *.dfm}
procedure transfertest; begin
IdFTP1.Connect;
Form1.IdFTP1.Put('C:\Program Files\Borland\Delphi7\Projects\Quelle\bsp.txt','C:\Program Files\FileZilla Server\Ziel',false);
IdFTP.Disconnect(true);
end;
begin
transfertest;
end. |
Leider kann ich den Code garnicht erst ausfuehren. Delphi 7 bietet ja verschiedene Items an:Application, Batch File, Component, Console App, Data Module, ...
Welchen Typ waehle ich denn am Besten dafuer aus?
Weiss jemand Rat?
Flux89
MDX - Sa 28.01.12 19:13
Am besten wäre wohl eine "Application" oder? ;)
Flux89 - Sa 28.01.12 19:43
Ok, habe nun eine Applikation erstellen (Form+Unit).
hier der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| unit myUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP;
type TForm1 = class(TForm) IdFTP1: TIdFTP; private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure transfertest; begin
Form1.IdFTP1.Connect;
Form1.IdFTP1.Put('C:\Program Files\Borland\Delphi7\Projects\Quelle\bsp.txt','C:\Program Files\FileZilla Server\Ziel',false);
Form1.IdFTP1.Disconnect(true);
end;
begin
transfertest;
end. |
Leider erscheint ein Fehler, warum?
platzwart - Sa 28.01.12 19:46
Kann es sein, dass du zuvor mit Pascal Konsolenanwendungen erstellt hast? So in der Art funktioniert das nicht. Füge der Form einen Button hinzu und weise dem OnClick-Ereignis deine Routine für die Verbindung zu.
Flux89 - Sa 28.01.12 20:04
Hi,
Ok, habe einen Button hinzugefuegt und im Object Inspector unter Events > OnClick transfertest eingetragen. Daraufhin wurde der Quellcode automatisch um ein paar Zeilen erweitert.
Mein Programm sieht nun so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| unit myUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP, StdCtrls;
type TForm1 = class(TForm) IdFTP1: TIdFTP; Button1: TButton; procedure transfertest(Sender: TObject);
private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.transfertest(Sender: TObject); begin Form1.IdFTP1.Connect;
Form1.IdFTP1.Put('C:\Program Files\Borland\Delphi7\Projects\Quelle\bsp.bmp','C:\Program Files\FileZilla Server\Ziel',false);
Form1.IdFTP1.Disconnect(true); end;
end. |
Fehlermeldung: "Invalid Filename!" Die Quell- und Zielpfade sowie die Dateinamen sind aber korrekt. hmm
Hier mal der Dialog aus Filezilla:
| Zitat: |
000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> Connected, sending welcome message...
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.40 beta
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> 220-written by Tim Kosse (Tim.Kosse@gmx.de)
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> 220 Please visit http://sourceforge.net/projects/filezilla/
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> HOST [127.0.0.1]
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> 500 Syntax error, command unrecognized.
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> USER ich
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> 331 Password required for ich
(000011)28.01.2012 20:26:06 - (not logged in) (127.0.0.1)> PASS ******
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 230 Logged on
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> FEAT
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 211-Features:
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> MDTM
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> REST STREAM
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> SIZE
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> MLST type*;size*;modify*;
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> MLSD
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> UTF8
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> CLNT
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> MFMT
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 211 End
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> CLNT Indy 10.5.8.0
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 200 Don't care
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> OPTS UTF8 ON
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 200 UTF8 mode enabled
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> TYPE I
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 200 Type set to I
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> SYST
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 215 UNIX emulated by FileZilla
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> TYPE I
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 200 Type set to I
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> PASV
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 227 Entering Passive Mode (127,0,0,1,4,49)
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> STOR C:\Program Files\FileZilla Server\Ziel
(000011)28.01.2012 20:26:06 - ich (127.0.0.1)> 550 Filename invalid
(000011)28.01.2012 20:26:13 - ich (127.0.0.1)> disconnected. |
Moderiert von
Narses: Beiträge zusammengefasstHabs mit anderen Pfaden und Dateinamen probiert, aber immer der gleiche Fehler..
EDIT: Habe den Zielpfad im put-Befehl entfernt.Weiterhin musste ich in Filezilla den Zielpfad als "Homedirectory" setzen. Nun klappt es! :)
MDX - Sa 28.01.12 20:44
Also, kleiner Tipp, du solltest erstmals die Basics lernen, desweiteren Pfadangabe mit Leerzeichen immer mit Anführungszeichen ->"<- angeben.
Flux89 - Di 31.01.12 23:57
Hi
MDX hat folgendes geschrieben : |
| Also, kleiner Tipp, du solltest erstmals die Basics lernen |
Bin dabei, nur das kostet viel Zeit. Ich habe bspw. noch grosse Schwierigkeiten die Indy Reference (ca. 60 MB pdf) zu verstehen. Also die Zusammenhänge, welche Funktion ich brauche, welche Parameter diese wiederum benötigt etc.
| Zitat: |
| Pfadangabe mit Leerzeichen immer mit Anführungszeichen ->"<- angeben. |
Mit "" um die Leerzeichen hats nicht funktioniert, ohne ja.
Da nun der rudimentaere FTP-Transfer funktioniert, wuerde ich das ganze gerne ueber aktiv, explizit FTPS machen. Habe dazu OpenSSL 1.0.0f eingebunden. Reicht es nun dem FTP IOHandler den IdSSLIOHandlerSocketOpenSSL zuzuweisen und beide im Object Manager zu konfigurieren?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| unit myUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP, StdCtrls;
type TForm1 = class(TForm) IdFTP1: TIdFTP; Button1: TButton; Textfeld: TEdit; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
procedure transfertest(Sender: TObject);
private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.transfertest(Sender: TObject); begin Form1.IdFTP1.Connect;
Form1.IdFTP1.Put('C:\Documents and Settings\Administrator\Desktop\Quelle\blabla.txt','',false);
IdFTP1.ListResult.Clear; IdFTP1.List('*',false); Textfeld.Text:='';
Form1.IdFTP1.Disconnect(true);
end;
end. |
Delete - Mi 01.02.12 11:51
Flux89 hat folgendes geschrieben : |
| Mit "" um die Leerzeichen hats nicht funktioniert, ohne ja. |
Nicht um die Leerzeichen, sondern um die ganze Pfadangabe.
Flux89 - Mo 13.02.12 11:07
Hallo,
folgende zwei Auszüge sind dem RFC 4217 entnommen. Ich frage mich, wie sie zusammenpassen. Beim ersten fehlt der Aufbau eines Datenkanals, beim zweiten fehlt das Drumherum (Aufbau des Steuerkanals).
FRAGE: Kann ich einfach den zweiten Auszug in den ersten an die Stelle kopieren, wo mein Kommentar 'DATENTRANSFERS?' steht?
1.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| Aufbau einer gesicherten Session
Client Server control data data control ====================================================================
socket() bind() socket() connect() ----------------------------------------------> accept() <---------------------------------------------- 220 AUTH TLS ----------------------------------------------> <---------------------------------------------- 234 TLSneg() <----------------------------------------------> TLSneg()
PBSZ 0 ----------------------------------------------> //optio <---------------------------------------------- 200 PROT P ----------------------------------------------> //nal <---------------------------------------------- 200 USER fred ----------------------------------------------> <---------------------------------------------- 331 PASS pass ----------------------------------------------> <---------------------------------------------- 230
<span style="font-weight: bold">DATENTRANSFERS?</span> kommt hier für jeden neuen Datentransfer eine eigene Aushandlung der Verschlüsselung sowie Authentifizierung von Client und Server? (siehe nächsten Auszug)
CCC ----------------------------------------------> <---------------------------------------------- 200 TLSshutdown() <-------------------------------------> TLSshutdown () |
2.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Client Server control data data control ====================================================================
socket() bind() PORT w,x,y,z,a,b --------------------------------------------> <-------------------------------------------------------- 200 STOR file ---------------------------------------------------> socket() bind() <-------------------------------------------------------- 150 accept() <---------- connect() TLSneg() <----------> TLSneg() TLSwrite() ----------> TLSread() TLSshutdown() -------> TLSshutdown() close() ----------> close() <-------------------------------------------------------- 226 |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!