Indy FTP



  • tach...

    ich habe zwei probleme mit dem indy ftp server. wenn ich da alles einherichtet habe und dann compiliere und starte, dann versuche mit einem client zu connecten, steht da die ganze zeit "listing directory" oder IE "suche ordner" oder so. wieso das? was mache ich falsch was fehlt noch?

    zweite frage: wie teile ich der componente usseraccounts zu? kann mir bitte jemand ein bsp machen?



    1. Das wirst du wohl selbst herausfinden müssen: den Server im Debug-Modus, also aus der IDE heraus starten, im OnClientConnect einen Haltepunkt setzen und dann schrittweise nachvollziehen, was passiert, welchen Wert die Variablen haben etc.

    2. TIdUserManager-Komponente (Indy Misc) auf die Form ziehen und dem Server zuweisen, in der Accounts-Property des Managers die Accounts erstellen.

    In Zukunft aber bitte immer nur ein Thema per Thread. Danke!



  • hallo jansen.
    danke, was 2. betrifft hast du mir geholfen und das klappt auch wunederbar 😉

    hmm, das problem bei 1. ist so das ich nict einfach einen debug machen kann weil schau mal:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        ftp->Active = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ftpUserLogin(TIdFTPServerThread *ASender,
          const AnsiString AUsername, const AnsiString APassword,
          bool &AAuthenticated)
    {
        if(AUsername == "test" && APassword == "123")
          {
            ASender->HomeDir = "C:\\";
                ASender->CurrentDir = "C:\\";
          }
    }
    

    das ist der ganze app code 😉 (will ja nur erstmal schauen ob der server auch tut hehe). wenn ich dann z.B. mit flashFXP rauf will, klappt das connecten ja auch alles schön. nur es werden keine files gelistet. am ende steht das:

    200 PORT Command successful.
    LIST
    125 File status okay; about to open data connection.
    Connection lost: XXX.XXX.XXX.XXX
    

    habe ich bei der indy componente etwas vergessen? z.B. "CommandHandlers" muss da speziell was rein?



  • Ich denke mal, dass du im OnListDirectory-Event dafür sorgen musst, dass ADirectoryListing entsprechend mit Dateinamen etc. gefüllt wird, damit du auch was zum Auflisten hast.

    Die Serverkomponente ist nur für den reinen FTP-Teil zuständig, die lokalen Dateioperationen musst du selbst implementieren.



  • dass ADirectoryListing entsprechend mit Dateinamen etc. gefüllt wird, damit du auch was zum Auflisten hast

    hmm verstehe ich nicht 😞 kannst du mir bitte ein beispiel machen? für mich ergibt dann nähmlich "HomeDir" und "CurrentDir" keinen sinn mehr wenn die teinamen in ADirectoryListing gespiesst werden.



  • Keine Ahnung, was mit HomeDir und CurrentDir ist. Wirf doch einfach mal einen Blick in die Hilfe, da steht zB. unter TIdFTPServer.OnListDirectory ganz eindeutig:

    Use the platform- specific API calls needed to retrieve the list of files for the specified directory, and populate the contents of ADirectoryListing.



  • hallo jansen 😞
    ich komme da irgendwie nicht klar. kriege das listen einfach nicht hin. weist du wo ich ein beispiel source zur indy ftp server componente downloaden kann?



  • Eigentlich auf der Indy-HP. Sind aber glaub ich alle für Delphi.



  • ich weis, so schlau war ich auch schon 🙂

    demo ftp client: ja
    demo ftp server: nein!

    😞 😞 😞



  • Stell Dir mal vor.... Du Programmierst ein FTP-Server mit einem
    ROOT-Zugriff (z.B. auf C:\) und jeder kann so tief wie möglich in
    die Verzeichnisse (auch c:\windows) durch serven. HILFE blos das nicht!!
    Es ist doch klar das Fremd-Operationen auf einen Computer beschränkt sein
    müssen. Um dem Anwender [einen Bereich] zu übergeben, muß du diesen difinieren,
    daher du stellst im den BasicROOT zur verfühgung (HomeDir), am besten
    programmierst du so das für den User eine Dir-und-Directory Datei angelegt wird
    sobald der User eine neue Dir anlegt wird diese ebenso in diesem Listing gespeichert, per OnClick auf einem Dir wechselst du im CurrentDir zu diesem
    Verzeichnis und listet dessen Inhalt (also Dateien) und übergiebst in (ADirectoryListing) wird eine Datei übertragen, speicher dessen ebenso darin.

    Fazit: Du kannst angeben welches das Hauptverzeichniss ist in HomeDir (z.B.:c:\inetpub\wwwroot\user1\html).
    Die Dateioperationen mußt du selbst steuern, wenn der user1 z.B. in seinem verzeichniss "Grafik" will, setzt du CurrentDir auf z.B. c:\inetpub\wwwroot\user1\html\Grafik
    liest denn Inhalt dieser Dir ein und Übergiebst an ADirectoryListing.
    Will user1 jetzt eine Datei löschen so mußt du (bzw. dein Programm) diese datei löschen und auch aus "ADirectoryListing" rausnehmen, sendet user1 eine datei, so speichert dein Proggi diese und giebt es auch in "ADirectoryListing" an.

    Also::UmEinenFTPServer->zuProgrammieren mußt du einiges an Datei-Operationen
    mit programmieren, denn das löst die Komponente micht von selbst.

    HomeDir = Start- bzw. Hauptverzeichnis des users (z.B. c:\wwwroot\user)
    CurrentDir = Aktuelles Verzeichnis in dem sich der user befindet (z.B. c:\wwwroot\user\Grafik
    ADirectoryListing = Inhalt des aktuellen Verzeichniss
    Per OnEvent Handling Dateioperationen ausführen.

    gruß Micha

    PS: sollte ich irgendwie Falsch liegen, bitte Korigieren.

    [ Dieser Beitrag wurde am 12.04.2003 um 00:06 Uhr von promicha editiert. ]



  • ich versteh das icht mit dem directorylisting 😞
    hier der code:

    void __fastcall TForm1::ftpListDirectory(TIdFTPServerThread *ASender,
          const AnsiString APath, TIdFTPListItems *ADirectoryListing)
    {
        //.... und nun?
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ftpUserLogin(TIdFTPServerThread *ASender,
          const AnsiString AUsername, const AnsiString APassword,
          bool &AAuthenticated)
    {
        if(AUsername == "test" && APassword == "test")
        {
            ASender->HomeDir = "C:\\";
            ASender->Authenticated = true;
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        ftp->Active = true;
    }
    

    was muss denn nun in ftpListDirectory?



  • void __fastcall TForm1::ftpListDirectory(TIdFTPServerThread *ASender,
          const AnsiString APath, TIdFTPListItems *ADirectoryListing)
    {
        //.... und nun?
    }
    //---------------------------------------------------------------------------
    

    1. In APath steht (meines Wissens) der Pfad den der User angefordert hat, also
    wenn er Beispielsweise in ein unterverzeichnis wechselt. PRÜFE ob der user Rechte hat zu diesem Verzeichniss, also wenn sein HomeDir z.B. c:\wwwroot\user1
    ist und APath ist c:\wwwroot\user1\grafik dann past es, Beispiel einfache Überprüfung:

    bool zugriff;   
    if (APath.SubString(0,ASender->HomeDir.Length()) == ASender->HomeDir)
             zugriff = true;
    else
             zugriff = false;
    

    Anschliessend liest die Dateinamen aus dem Verzeichniss welcher in APath steht
    in ADirectoryListing ein. Ich habe diese IndyKomponente bei mir nicht, daher kann ich jetzt nicht sagen in welcher Form die Daten an ADirectoryListing übergeben werden, daher probiere einfach mal ADirectoryListing-> und nach dem du
    das > eingeben hast erscheint eine Hilfe (vieleicht ADirectoryListing->AddItems.. oder so) probiere mal durch.

    cu micha



  • ich kriegs einfach nicht hin es ist hoffnungslos 😞
    weis den niemand wie genau das listen geht? oder wo ich ein bsp. finde? oder eine andere:

    Free
    BCB taugliche
    FTP Server componente

    ? 😕 ?


Anmelden zum Antworten