Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi indy FTP Server Beispiel funktioniert nicht... (https://www.delphipraxis.net/87061-indy-ftp-server-beispiel-funktioniert-nicht.html)

EDatabaseError 22. Feb 2007 19:59


indy FTP Server Beispiel funktioniert nicht...
 
Ich habe mir die indy FTP Server Demo herruntergeladen. Leider funktioniert sie nicht wirklich...

Hier habe ich einmal den Source:
Delphi-Quellcode:
unit uFTPServer;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdBaseComponent, IdComponent, IdTCPServer, IdCmdTCPServer, IdFTPList,
  IdExplicitTLSClientServerBase, IdFTPServer, StdCtrls, IdFTPListOutput;

type
  TForm1 = class(TForm)
    btnClose: TButton;
    moNotes: TMemo;
    procedure IdFTPServer1UserLogin(ASender: TIdFTPServerContext;
      const AUsername, APassword: string; var AAuthenticated: Boolean);
    procedure IdFTPServer1RemoveDirectory(ASender: TIdFTPServerContext;
      var VDirectory: string);
    procedure IdFTPServer1MakeDirectory(ASender: TIdFTPServerContext;
      var VDirectory: string);
    procedure IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext;
      const AFileName: string; var VStream: TStream);
    procedure IdFTPServer1GetFileSize(ASender: TIdFTPServerContext;
      const AFilename: string; var VFileSize: Int64);
    procedure IdFTPServer1StoreFile(ASender: TIdFTPServerContext;
      const AFileName: string; AAppend: Boolean; var VStream: TStream);
    procedure IdFTPServer1ListDirectory(ASender: TIdFTPServerContext;
      const APath: string; ADirectoryListing: TIdFTPListOutput; const ACmd,
      ASwitches: string);
    procedure FormCreate(Sender: TObject);
    procedure IdFTPServer1DeleteFile(ASender: TIdFTPServerContext;
      const APathName: string);
    procedure IdFTPServer1ChangeDirectory(ASender: TIdFTPServerContext;
      var VDirectory: string);
    procedure btnCloseClick(Sender: TObject);
  private
    function ReplaceChars(APath: String): String;
    function GetSizeOfFile(AFile : String) : Integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  IdFTPServer1: TIdFTPServer;
  AppDir     : String;

implementation
{$R *.DFM}

procedure TForm1.btnCloseClick(Sender: TObject);
begin
  IdFTPServer1.Active := false;
  close;
end;

function TForm1.ReplaceChars(APath:String):String;
var
 s:string;
begin
  s := StringReplace(APath, '/', '\', [rfReplaceAll]);
  s := StringReplace(s, '\\', '\', [rfReplaceAll]);
  Result := s;
end;

function TForm1.GetSizeOfFile(AFile : String) : Integer;
var
 FStream : TFileStream;
begin
Try
 FStream := TFileStream.Create(AFile, fmOpenRead);
 Try
  Result := FStream.Size;
 Finally
  FreeAndNil(FStream);
 End;
Except
 Result := 0;
End;
end;

procedure TForm1.IdFTPServer1ChangeDirectory(
  ASender: TIdFTPServerContext; var VDirectory: string);
begin
  ASender.CurrentDir := VDirectory;
end;

procedure TForm1.IdFTPServer1DeleteFile(ASender: TIdFTPServerContext;
  const APathName: string);
begin
  DeleteFile(ReplaceChars(AppDir+ASender.CurrentDir+'\'+APathname));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 idftpserver1 := tidftpserver.create(self);
 with idftpserver1 do
  begin
    Active := True;
//    Bindings := [];
    DefaultPort := 21;
//    CommandHandlers := [];
    ExceptionReply.Code := '500';
    ExceptionReply.Text.Add('Unknown Internal Error');
    Greeting.Code := '220';
    Greeting.Text.Add('Indy FTP Server ready.');
    HelpReply.Text.Add('Help follows');
    MaxConnectionReply.Code := '300';
    MaxConnectionReply.Text.Add('Too many connections. Try again later.');
//  ReplyTexts = <>
    ReplyUnknownCommand.Code := '500';
    ReplyUnknownCommand.Text.Add('Syntax error, command unrecognized.');
    AllowAnonymousLogin := True;
    AnonymousAccounts.Add('anonymous');
    AnonymousAccounts.Add('ftp');
    AnonymousAccounts.Add('guest');
    AnonymousPassStrictCheck := False;
    SystemType := 'WIN32';
    OnChangeDirectory := IdFTPServer1ChangeDirectory;
    OnGetFileSize := IdFTPServer1GetFileSize;
    OnUserLogin := IdFTPServer1UserLogin;
    OnListDirectory := IdFTPServer1ListDirectory;
    OnDeleteFile := IdFTPServer1DeleteFile;
    OnRetrieveFile := IdFTPServer1RetrieveFile;
    OnStoreFile := IdFTPServer1StoreFile;
    OnMakeDirectory := IdFTPServer1MakeDirectory;
    OnRemoveDirectory := IdFTPServer1RemoveDirectory;
//    SITECommands = <>
    MLSDFacts := [];
    ReplyUnknownSITCommand.Code := '500';
    ReplyUnknownSITCommand.Text.Add('Invalid SITE command.');

   {Active := true;
   Bindings :=;
   OnUserLogin      := IdFTPServer1UserLogin;
   OnRemoveDirectory := IdFTPServer1RemoveDirectory;
   OnMakeDirectory  := IdFTPServer1MakeDirectory;
   OnRetrieveFile   := IdFTPServer1RetrieveFile;
   OnGetFileSize    := IdFTPServer1GetFileSize;
   OnStoreFile      := IdFTPServer1StoreFile;
   OnListDirectory  := IdFTPServer1ListDirectory;
   OnDeleteFile     := IdFTPServer1DeleteFile;
   OnChangeDirectory := IdFTPServer1ChangeDirectory;  }
  end;
 AppDir := ExtractFilePath(Application.Exename);
end;

procedure TForm1.IdFTPServer1ListDirectory(ASender: TIdFTPServerContext;
  const APath: string; ADirectoryListing: TIdFTPListOutput; const ACmd,
  ASwitches: string);
var
 LFTPItem :TIdFTPListItem;
 SR : TSearchRec;
 SRI : Integer;
begin
  ADirectoryListing.DirFormat := doUnix;
  SRI := FindFirst(AppDir + APath + '\*.*', faAnyFile - faHidden - faSysFile, SR);
  While SRI = 0 do
  begin
    LFTPItem := ADirectoryListing.Add;
    LFTPItem.FileName := SR.Name;
    LFTPItem.Size := SR.Size;
    LFTPItem.ModifiedDate := FileDateToDateTime(SR.Time);
    if SR.Attr = faDirectory then
     LFTPItem.ItemType  := ditDirectory
    else
     LFTPItem.ItemType  := ditFile;
    SRI := FindNext(SR);
  end;
  FindClose(SR);
  SetCurrentDir(AppDir + APath + '\..');
end;

procedure TForm1.IdFTPServer1StoreFile(ASender: TIdFTPServerContext;
  const AFileName: string; AAppend: Boolean; var VStream: TStream);
begin
 if not Aappend then
   VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmCreate)
 else
   VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmOpenWrite)
end;

procedure TForm1.IdFTPServer1GetFileSize(ASender: TIdFTPServerContext;
  const AFilename: string; var VFileSize: Int64);
Var
 LFile : String;
begin
 LFile := ReplaceChars( AppDir + AFilename );
 try
 If FileExists(LFile) then
   VFileSize := GetSizeOfFile(LFile)
 else
   VFileSize := 0;
 except
   VFileSize := 0;
 end;
end;

procedure TForm1.IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext;
  const AFileName: string; var VStream: TStream);
begin
  VStream := TFileStream.Create(ReplaceChars(AppDir+AFilename),fmOpenRead);
end;

procedure TForm1.IdFTPServer1MakeDirectory(ASender: TIdFTPServerContext;
  var VDirectory: string);
begin
  if not ForceDirectories(ReplaceChars(AppDir + VDirectory)) then
  begin
    Raise Exception.Create('Unable to create directory');
  end;
end;

procedure TForm1.IdFTPServer1RemoveDirectory(ASender: TIdFTPServerContext;
  var VDirectory: string);
Var
 LFile : String;
begin
  LFile := ReplaceChars(AppDir + VDirectory);
  // You should delete the directory here.
  // TODO
end;

procedure TForm1.IdFTPServer1UserLogin(ASender: TIdFTPServerContext;
  const AUsername, APassword: string; var AAuthenticated: Boolean);
begin
 // We just set AAuthenticated to true so any username / password is accepted
 // You should check them here - AUsername and APassword
 showmessage('asd');
 AAuthenticated := True;
end;

end.
Bitte schaut mal drüber...

Tobi


//Edit : Es kommt ein Timeout beim herstellen der Verbindung.

SirThornberry 22. Feb 2007 20:18

Re: indy FTP Server Beispiel funktioniert nicht...
 
eine timeout deutet darauf hinn das der server nicht aktiv ist. Hast du ihn irgendwo auf aktiv gesetzt?

EDatabaseError 22. Feb 2007 20:23

Re: indy FTP Server Beispiel funktioniert nicht...
 
Zitat:

Zitat von SirThornberry
eine timeout deutet darauf hinn das der server nicht aktiv ist. Hast du ihn irgendwo auf aktiv gesetzt?

jup...

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
idftpserver1 := tidftpserver.create(self);
with idftpserver1 do
  begin
    Active := True; ////////////////////////////////////////////////hier
//    Bindings := [];
    DefaultPort := 21;
//    CommandHandlers := [];
    ExceptionReply.Code := '500';
:gruebel:

Tobi

SirThornberry 22. Feb 2007 20:29

Re: indy FTP Server Beispiel funktioniert nicht...
 
ich hatte auch mal nen ftp-server mit source gepostet, hast du den mal probiert?

EDatabaseError 22. Feb 2007 20:31

Re: indy FTP Server Beispiel funktioniert nicht...
 
ja...aber der läuft nur mit indy 9 ...ich hab indy 10... da geht er nich...

aber was mich wundert ich hab das offizielle indy 10 beispiel...und das läuft nicht...

tobi

inherited 22. Feb 2007 21:03

Re: indy FTP Server Beispiel funktioniert nicht...
 
teste ihn doch mal mit einem anderen FTP-Client.

EDatabaseError 22. Feb 2007 21:08

Re: indy FTP Server Beispiel funktioniert nicht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ih könnt ihn ja mal testen ;-)

Tobi

EDatabaseError 22. Feb 2007 22:06

Re: indy FTP Server Beispiel funktioniert nicht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich es über localhost versuche bekomme ich gleich die Meldung das die Verbindung nicht erfolgreich seie... :gruebel:



//edit
hier mal die sourcen...bitte testen...ich schaffe es nicht :-(

inherited 23. Feb 2007 13:20

Re: indy FTP Server Beispiel funktioniert nicht...
 
Funktioniert bei mir Wunderbar: Server gestartet, Firefox auf und ftp://localhost:21 rein. Fertig.

EDatabaseError 23. Feb 2007 17:03

Re: indy FTP Server Beispiel funktioniert nicht...
 
Zitat:

Zitat von inherited
Funktioniert bei mir Wunderbar: Server gestartet, Firefox auf und ftp://localhost:21 rein. Fertig.

hmmm...kannst du mal deine EXE posten. Bei mir tuts nämlich nich.

inherited 24. Feb 2007 22:02

Re: indy FTP Server Beispiel funktioniert nicht...
 
Ich merke gerade, es hat nur funktioniert, weil mein FTP-Server, den ich eigentlich dachte beendet zu haben noch lief :oops:
Deine Exe funktioniert tatsächlich nicht

EDatabaseError 24. Feb 2007 22:29

Re: indy FTP Server Beispiel funktioniert nicht...
 
Zitat:

Zitat von inherited
Ich merke gerade, es hat nur funktioniert, weil mein FTP-Server, den ich eigentlich dachte beendet zu haben noch lief :oops:
Deine Exe funktioniert tatsächlich nicht

...ich dachte schon...

:wall: aber warum tut dieses offizielle indy Beispiel nich. Dat kann doch nich sein.

inherited 24. Feb 2007 22:36

Re: indy FTP Server Beispiel funktioniert nicht...
 
ich weiß schon, warum ich bei Indy 9 geblieben bin ;)

Christian Seehase 24. Feb 2007 22:53

Re: indy FTP Server Beispiel funktioniert nicht...
 
Moin Tobias,

kommentiere mal im IdFTPServer1Connect das ShowMessage aus.

Ich habe Dein Programm gestartet, FileZilla aufgerufen, und versucht mit eine Verbindung auf localhost:21 aufzubauen.
=> Timeout

Nachdem ich auf das Fenster "Indy FTP Server" geklickt hatte, kam das ShowMessage-Fenster aus dem Connect-Event nach vorne.
Sobald man das bestätigt, erfolgt die Verbindung.

[EDIT]
Getestet mit Delphi 2006 und Indy 10
[/EDIT]

[EDIT2]
Deine FTPServer.Exe habe ich eben auch noch einmal getestet: Die tut's wirklich nicht, aber ich bekomme kein Timeout, sondern direkt die Meldung, dass keine Verbindung herstellt werden kann
[/EDIT2]

EDatabaseError 24. Feb 2007 23:16

Re: indy FTP Server Beispiel funktioniert nicht...
 
Zitat:

Zitat von Christian Seehase
Moin Tobias,

kommentiere mal im IdFTPServer1Connect das ShowMessage aus.

Ich habe Dein Programm gestartet, FileZilla aufgerufen, und versucht mit eine Verbindung auf localhost:21 aufzubauen.
=> Timeout

Nachdem ich auf das Fenster "Indy FTP Server" geklickt hatte, kam das ShowMessage-Fenster aus dem Connect-Event nach vorne.
Sobald man das bestätigt, erfolgt die Verbindung.

[EDIT]
Getestet mit Delphi 2006 und Indy 10
[/EDIT]

[EDIT2]
Deine FTPServer.Exe habe ich eben auch noch einmal getestet: Die tut's wirklich nicht, aber ich bekomme kein Timeout, sondern direkt die Meldung, dass keine Verbindung herstellt werden kann
[/EDIT2]

An was kann das liegen das meine EXE nich tut und die welche du compilierst schon?

Ich habe TD2006. Die Indys sind im Suchpfad eingetragen.

Mfg
Tobi

Christian Seehase 24. Feb 2007 23:47

Re: indy FTP Server Beispiel funktioniert nicht...
 
Moin Tobias,

woran das liegt kann ich Dir auch nicht sagen.
Ich habe es mal mit TD unter Vista probiert, und bekome dort sofort eine Fehlermeldung:
Socket Error 10022, Invalid Argument :gruebel:

EDatabaseError 24. Feb 2007 23:53

Re: indy FTP Server Beispiel funktioniert nicht...
 
Hmm...schon komisch.

Gibt es nich eine andere FTP Server Kompo. (mit Beispielen) die ich locker in TD einbinden kann?

Mfg
Tobi

Hobby-Programmierer 25. Feb 2007 00:36

Re: indy FTP Server Beispiel funktioniert nicht...
 
Nabend ...,
Zitat:

Zitat von EDatabaseError
Hmm...schon komisch.
Gibt es nich eine andere FTP Server Kompo. (mit Beispielen) die ich locker in TD einbinden kann?

Vielleicht solltest Du ICS testen. Hab mit TD allerdings keine Erfahrung.

EDatabaseError 25. Feb 2007 10:20

Re: indy FTP Server Beispiel funktioniert nicht...
 
Also mit der ICS Kompo hats beim ersten Versuch geklappt :thumb:

Mfg
Tobi


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz