Stefan: Dateihandle von Windows bekommen

Hallo,

mein Perl-Programm schreibt Daten aus einem HTML-Formular in eine Datei auf dem Client-Computer. Das ganze läuft in einem Intranet, d.h. ich habe Zugriff auf den Client-Rechner über das Local Network.

Ich würde gerne den Datei-Handle von Windows bekommen, d.h. das standardisierte 'Datei speichern' Fenster von Windows geht auf, dort kann man dann Laufwerk, Verzeichnis und Dateinamen eingeben und anschließend bekommt mein Perl-Programm den Datei-Handle und dann kann ich die Daten schreiben und hinterher die Datei schließen.

Geht sowas?

Oder gibt es unter CGI/Perl Bibliotheken, die das Browsen in der Verzeichnisstruktur erlauben?

Gruß,
Stefan

  1. Hi,

    Ich würde gerne den Datei-Handle von Windows bekommen, d.h. das standardisierte 'Datei speichern' Fenster von Windows geht auf, dort kann man dann Laufwerk, Verzeichnis und Dateinamen eingeben und anschließend bekommt mein Perl-Programm den Datei-Handle und dann kann ich die Daten schreiben und hinterher die Datei schließen.

    Also das Standard-Öffnen-Speichern-Fenster bekommst du garantiert über einen API-Funktionsaufruf. Schau mal nach dem Modul Win32API.
    Kann auch sein, dass es in Tk eingepackt ist, falls dir das zur Verfügung steht.

    HTH

    ortenau-s-bahner

    --
    ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
    1. Hi,

      Also das Standard-Öffnen-Speichern-Fenster bekommst du garantiert über einen API-Funktionsaufruf. Schau mal nach dem Modul Win32API.
      Kann auch sein, dass es in Tk eingepackt ist, falls dir das zur Verfügung steht.

      Wer soll denn den API-Funktionsaufruf auslösen? Mein Perl-Script? Das läuft ja auf dem UNIX Webserver und kennt den Client-Rechner gar nicht.
      Würde das mit JavaScript gehen?

      Stefan
      *hilflos*

      1. Hi,

        Wer soll denn den API-Funktionsaufruf auslösen? Mein Perl-Script? Das läuft ja auf dem UNIX Webserver und kennt den Client-Rechner gar nicht.
        Würde das mit JavaScript gehen?

        Also nur um sicherzustellen, dass ich das richtig verstanden habe. Das Skript auf dem Server soll eine Datei speichern und der Client soll bestimmen wo hin. Dass das jetzt zufällig die Freigabe auf dem Client ist, ist ja erst mal egal. Soweit richtig?

        Wenn das ganze im Intranet abläuft, wieso lässt du die Datei dann nicht einfach über das Skript und HTTP ausgeben und konfigurierst die Browser entsprechend, dass der Client über den gewöhnlichen Browser-Speichern-unter-Dialog den Speicherort festlegen kann. Müsste einfach für diesen Dateityp festgelegt werden, dass der nicht angezeigt oder geöffnet sondern gespeichert werden soll. Kann man AFAIK auch über bestimmte HTTP-Header forcieren, zumindest macht das PhpMyAdmin so. (beim Dumpen)

        HTH

        ortenau-s-bahner

        --
        ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
        1. Hallo,

          Also nur um sicherzustellen, dass ich das richtig verstanden habe. Das Skript auf dem Server soll eine Datei speichern und der Client soll bestimmen wo hin. Dass das jetzt zufällig die Freigabe auf dem Client ist, ist ja erst mal egal. Soweit richtig?

          Richtig!
          Zur Not wäre auch ein fester Speicherort denkbar, aber es muss auf dem Client sein.

          Das läuft so:
          Ein HTML-Formular erfragt bestimte Userdaten und nach Eingabe werden die Daten vom Perl-Script auf dem Server in eine XML-Datei auf dem Client geschrieben.

          Später kann der User wiederkommen und die Daten sollen dann aus der XML-Datei wieder in die Formularfelder übernommen werden.

          Ich nehme an, dass das mit Cookies lösbar wäre, aber ich soll keine Cookies verwenden!

          Leider habe ich nicht verstanden, was Du mir versucht hast zu erklären. ;-(((
          Wie soll ich den Browser konfigurieren???

          Hast Du einen gescheiten Link zum Lesen?

          Danke und Gruß,
          Stefan

          1. Hi,

            Zur Not wäre auch ein fester Speicherort denkbar, aber es muss auf dem Client sein.

            Ich weiss nicht genau, wie die Pfade zu Windows-Shares unter Unix aussehen, aber ich denke, man kann die doch sicherlich irgendwie mounten, dass man dann ganz normal schreiben kenn:

            open FILE, '>/shares/client4711/share/dingens.dat' or die $!;

            Wie soll ich den Browser konfigurieren???

            Wenn du bspw. *.dat Dateien verschickst, musst du halt die Browser auf Clientseite so einstellen, dass sie für *.dat Dateien keine extra Anwendung starten und auch nicht versuchen das selbst darzustellen, sondern dass sie eben den Speichern-unter-Dialog anzeigen. Wie das im Detail geht, hängt natürlich von dem (den) verwendeten Browser(n) ab, sowie von deinen Zugriffsmöglichkeiten auf die Clientrechner.

            Notfalls erfolgt die Konfiguration halt per Firmenrundschreiben "Speichern Sie bitte *.dat-Dateien aus unserem Intranet manuell in den Ordner c:/xyz" ;-)

            HTH

            ortenau-s-bahner

            --
            ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
            1. Hi,

              open FILE, '>/shares/client4711/share/dingens.dat' or die $!;

              Aber dazu müsste sich der User erst einmal identifizieren, und das macht er im Moment nicht. Damit kenne ich auch nicht den Rechner. Oder finde ich bei einer CGI-Anforderung des Client diese Info (z.B. sein IP-Adresse oder sowas) irgendwo in den Umgebungsvariablen???

              ... sondern dass sie eben den Speichern-unter-Dialog anzeigen.

              Ich wusste gar nicht, dass sowas geht...

              Alles in allem scheint das wohl sehr kompliziert zu sein. Das Zeug wird mal weltweit laufen, da kann ich mir nicht vorstellen, dass ich alle Browser umkonfigurieren will...
              Vielleicht kann ich die Jungs überzeugen, das Ganze doch in einem Cookie abzulegen. Dann hat man zumindest vom Browser aus immer wieder Zugriff auf die Daten.

              Danke für Deine Hilfe!

              Gruß,
              Stefan

              1. Hi,

                open FILE, '>/shares/client4711/share/dingens.dat' or die $!;
                Aber dazu müsste sich der User erst einmal identifizieren, und das macht er im Moment nicht. Damit kenne ich auch nicht den Rechner. Oder finde ich bei einer CGI-Anforderung des Client diese Info (z.B. sein IP-Adresse oder sowas) irgendwo in den Umgebungsvariablen???

                use CGI;

                print CGI::remote_host();

                HTH

                ortenau-s-bahner

                --
                ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
                1. Hi,

                  use CGI;

                  print CGI::remote_host();

                  Na das könnte vielleicht doch helfen. Ich muss mich mal intensiver mit CGI beschäftigen. Und wenn ich den Client erst mal identifiziert habe, vielleicht geht dann ja auch das open FILE...

                  Gruß,
                  Stefan

                  1. use CGI;

                    print CGI::remote_host();

                    Na das könnte vielleicht doch helfen. Ich muss mich mal intensiver mit CGI beschäftigen. Und wenn ich den Client erst mal identifiziert habe, vielleicht geht dann ja auch das open FILE...

                    Nein, mit open kannst du keine Netzwerkverbindung aufbauen.

                    Soweit ich dich bis jetzt verstanden habe ist das was du willst definitiv nicht möglich. So wie ich das sehe (ich hab nicht wirklich viel Ahnung von Netzwerken) willst du mit einem CGI Programm den Rechnernamen im Netzwerk rauskriegen um dann auf diesen Rechner über das Netzwerk zugreifen zu können.

                    Soweit ich das weiß geht das nicht. Da du per CGI zwar die IP Nummer rauskriegst, aber damit nur Zugriff auf den Rechner hast, wenn auf diesen einen server oder ein anderes Programm, mit dem du über das Netzwerk kommunizieren kannst , läuft.

                    Per CGI hast du logischerweise nur einen sehr beschränkten Zugriff auf den Client. Die einzige Lösung dauerhaft etwas auf dem Client zu speichern sind Cookies.

                    Soweit ich das sehe brauchst du eine Netzerk spezifische Lösung, bei der du mit ausführbaren Dateien (keine CGIs) arbeitest. Aber bevor ich jetzt Mist erzähle - damit kenne ich mich nicht aus.

                    Struppi.

                    1. Hi Struppi,

                      Per CGI hast du logischerweise nur einen sehr beschränkten Zugriff auf den Client. Die einzige Lösung dauerhaft etwas auf dem Client zu speichern sind Cookies.

                      Ich habe das irgendwie schon befürchtet. Aber wenn ich jetzt mit hoher Wahrscheinlichkeit weiß, dass es nicht geht, dann kann ich mich darauf einstellen und versuchen, meinen Auftraggeber von Cookies zu überzeugen.

                      Danke und Gruß,
                      Stefan

  2. Ich würde gerne den Datei-Handle von Windows bekommen, d.h. das standardisierte 'Datei speichern' Fenster von Windows geht auf, dort kann man dann Laufwerk, Verzeichnis und Dateinamen eingeben und anschließend bekommt mein Perl-Programm den Datei-Handle und dann kann ich die Daten schreiben und hinterher die Datei schließen.

    kann es sein, dass du <input type="file"> suchst?

    und wie man das auf dem Server speichert: http://aktuell.de.selfhtml.org/artikel/cgiperl/file-upload/index.htm

    Struppi.

    1. Hallo Struppi,

      Nein ich suche das Gegenteil. Ich will die Formulardaten aus dem HTML-Formular in eine Textdatei auf dem Client-Rechner schreiben.

      JavaScript oder Perl ist mir egal. Aber ich weiß einfach nicht, wie ich auf die Datei-Struktur des Client zugreifen kann.

      Die Formulardaten auf dem Server speichern (mit Perl) kann ich, das wäre kein Problem...

      Gruß,
      Stefan

      1. Nein ich suche das Gegenteil. Ich will die Formulardaten aus dem HTML-Formular in eine Textdatei auf dem Client-Rechner schreiben.

        Genau das wird auf der Seite beschrieben.

        JavaScript oder Perl ist mir egal. Aber ich weiß einfach nicht, wie ich auf die Datei-Struktur des Client zugreifen kann.

        Nicht mit Perl das auf dem Server läuft und auch nicht mit JS.

        Struppi.

        1. Hi.

          Nein ich suche das Gegenteil. Ich will die Formulardaten aus dem HTML-Formular in eine Textdatei auf dem Client-Rechner schreiben.

          Genau das wird auf der Seite beschrieben.

          Meiner Meinung nach nicht. Es wird beschrieben, wie die Client-Datei auf dem Server gespeichert wird. Ich will aber auf dem Client speichern. Oder hab ich es nicht verstanden???

          JavaScript oder Perl ist mir egal. Aber ich weiß einfach nicht, wie ich auf die Datei-Struktur des Client zugreifen kann.

          Nicht mit Perl das auf dem Server läuft und auch nicht mit JS.

          Sondern???

          Gruß,
          Stefan

          1. JavaScript oder Perl ist mir egal. Aber ich weiß einfach nicht, wie ich auf die Datei-Struktur des Client zugreifen kann.

            Nicht mit Perl das auf dem Server läuft und auch nicht mit JS.
            Sondern???

            Im Browser gar nicht.

            Bzw. du kannst auf das Netzwerk zugreifen, aber nicht per Datei-save Dialog, sondern nur über window.location = ...

            Die ... ist der Pfad zu deiner Netzwerkdatei. eine andere Möglichkeit gibt es IMHO nicht. Mit Perl als CGI Programm auch nicht, da dieses ja auf dem Server läuft und nicht auf den Client zugreifen kann. JS hat normalerweise auch keinen Zugriff auf das Dateisystem. Mit Java kann u.U. sowas gehen, ich weiß aber nicht wie.

            Struppi.

            1. Hi Struppi,
              danke erst mal für die Hilfe.
              Vielleicht weiß ja noch jemand was?
              Ich werde das nochmal mit einer etwas passenderen Betreff-Zeile posten...
              Gruß,
              Stefan