idFTP-Client erstellen
spacer
Autor Nachricht
Flux89
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 28.01.12 20:01 
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.

ausblenden volle Höhe Delphi-Quelltext markieren
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; //Hauptprogramm

private
{ Private declarations }
public
{ Public declarations }
end;

implementation

{$R *.dfm}

procedure transfertest;
begin

IdFTP1.Connect;

//if(Form1.IdFTP1.Connected=true)
//then begin
//Form1.Edit1.Text:='verbunden';
//end;

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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 571
Erhaltene Danke: 4

Windows 7 Ultimate, Linux Ubuntu 11.04 (Virtual: Windows XP/Vista)
RAD Studio XE 2, PHP, Java (Android)
BeitragVerfasst: Sa 28.01.12 20:13 
Am besten wäre wohl eine "Application" oder? ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Flux89 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 28.01.12 20:43 
Ok, habe nun eine Applikation erstellen (Form+Unit).

hier der Code:
ausblenden volle Höhe Delphi-Quelltext markieren
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
{ Private declarations }
public
{ Public declarations }
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?
Einloggen, um Attachments anzusehen!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic starofftopic star
Beiträge: 1008
Erhaltene Danke: 67

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Sa 28.01.12 20: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.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Flux89 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 28.01.12 21: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:
ausblenden volle Höhe Delphi-Quelltext markieren
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
{ Private declarations }
public
{ Public declarations }
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 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 user profile iconNarses: Beiträge zusammengefasst

Habs 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! :)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 571
Erhaltene Danke: 4

Windows 7 Ultimate, Linux Ubuntu 11.04 (Virtual: Windows XP/Vista)
RAD Studio XE 2, PHP, Java (Android)
BeitragVerfasst: Sa 28.01.12 21:44 
Also, kleiner Tipp, du solltest erstmals die Basics lernen, desweiteren Pfadangabe mit Leerzeichen immer mit Anführungszeichen ->"<- angeben.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Flux89 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 01.02.12 00:57 
Hi

user profile iconMDX hat folgendes geschrieben Zum zitierten Posting springen:
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?

ausblenden volle Höhe Delphi-Quelltext markieren
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
{ Private declarations }
public
{ Public declarations }
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 571
Erhaltene Danke: 4

Windows 7 Ultimate, Linux Ubuntu 11.04 (Virtual: Windows XP/Vista)
RAD Studio XE 2, PHP, Java (Android)
BeitragVerfasst: Mi 01.02.12 01:03 
user profile iconFlux89 hat folgendes geschrieben Zum zitierten Posting springen:
Hi

user profile iconMDX hat folgendes geschrieben Zum zitierten Posting springen:
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.


Damit meine ich nicht die Indy-Basics, sondern die allgemeinen Delphi-Basics. Fang also vielleicht lieber mit etwas einfacherem wie z.B. einem Text-Editor (inkl. Laden/Speichern) o.ä. an.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Luckie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 11803
Erhaltene Danke: 146

WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
BeitragVerfasst: Mi 01.02.12 12:51 
user profile iconFlux89 hat folgendes geschrieben Zum zitierten Posting springen:
Mit "" um die Leerzeichen hats nicht funktioniert, ohne ja.

Nicht um die Leerzeichen, sondern um die ganze Pfadangabe.

_________________
Gruß Michael
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dude566
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1486
Erhaltene Danke: 72

W7, Vista, XP, Ubuntu
Delphi XE2 Pro, Turbo Delphi, Java/Eclipse, Notepad++
BeitragVerfasst: Mi 01.02.12 13:04 
Wenn du noch Probleme dabei hast die Indy Komponenten zu verstehen, schau dir das mal an: www.delphi-treff.de/...net/indy/ftp-tidftp/

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Flux89 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 06.02.12 19:41 
Hallo,

ich mache nun weiter Tutorials, um die Delphi Grundlagen zu üben. :)

Parallel lese ich mich in FTPS ein, auch wenn ich bisher nicht viel Material dazu gefunden habe.

Wie ist der genaue (Kommandos, Replies) Ablauf beim Aufbau einer FTP over TLS Session? Habe dazu einen Thread gestartet: www.mcseboard.de/win...818.html#post1133593


Wäre super wenn ihr mir helfen könntet :)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Flux89 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 13.02.12 12: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.
ausblenden volle Höhe Quelltext markieren
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

[b]DATENTRANSFERS?[/b]
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.
ausblenden Quelltext markieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home