Millennium: Datei upload mit Perl - Datei-Caching am Webserver?

Hallo,

ich habe ein Skript geschrieben, das per Formulareingabe einen Dateiupload auf einen Webserver ermöglicht. Ich habe auch einen Fortschrittsbalken implementiert.

Lokal funktioniert das Ganze - nicht aber auf unserem Webserver. Den Grund dafür habe ich sozusagen auch schon gefunden, nicht aber die Ursache. Vielleicht kann mir hier jemand helfen.

Ich schreibe die Datei auf den Webserver und lasse ein Skript die aktuelle Größe der Datei auf dem Server auslesen. Die komplette Dateigröße habe ich ja, also kann ich die bereits hochgeladene Prozentzahl errechnen.

Lokal funktioniert das alles - ich kann im Windows Explorer oder per FTP verfolgen, wie die Datei auf dem Server langsam wächst. Auf dem Webserver klappt das nicht - es sieht so aus, als wird dort die Datei zuerst komplett hochgeladen und temporär in einem anderen Verzeichnis gespeichert bzw. gecached und dann in mein Zielverzeichnis kopiert.

Kann mir jemand sagen, ob meine Vermutung richtig ist und wie ich dieses Verhalten ändern kann? Vielen Dank schonmal!

Gruß

Millennium

  1. ich habe ein Skript geschrieben, das per Formulareingabe einen Dateiupload auf einen Webserver ermöglicht. Ich habe auch einen Fortschrittsbalken implementiert.

    Das geht nicht. Der Dateiupload erfolgt per Browser <-> Server und hier hast du keinen direkten Einfluss. Das Upload skript wird erst gestartet, wenn die komplette Datei übertragen wurde.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Also ich denke, daß es eben schon geht. Mit meinem lokalen Webserver geht es ja auch. Ich schreibe in einer Schleife halt nen Brocken der Datei auf den Webserver und gebe danach etwas html-Code aus. Im nächsten Durchlauf wieder usw. Das müßte doch klappen?!?

      1. Also ich denke, daß es eben schon geht. Mit meinem lokalen Webserver geht es ja auch. Ich schreibe in einer Schleife halt nen Brocken der Datei auf den Webserver und gebe danach etwas html-Code aus. Im nächsten Durchlauf wieder usw. Das müßte doch klappen?!?

        Nein, das klappt nicht, weil die Datei nicht in Happen an das Skript übermittelt wird, sondern der server warten, bis die Datei komplett geladen wurde und dann das Skript starten und die Upload Datei vollständig auf dem Server liegt.
        D.h. du müßtest den Server entsprechend anpassen oder umprogrammieren.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Nein, das klappt nicht, weil die Datei nicht in Happen an das Skript übermittelt wird, sondern der server warten, bis die Datei komplett geladen wurde und dann das Skript starten und die Upload Datei vollständig auf dem Server liegt.
          D.h. du müßtest den Server entsprechend anpassen oder umprogrammieren.

          Hm... warum gehts dann auf dem lokalen Webserver?
          Aber ich glaube ich verstehe, was Du meinst - die Datei wird quasi erstmal komplett über das HTML-Formular hochgeladen, und dann am Server an das Skript übergeben?!? Aber warum klappt das dann lokal?

          1. Hm... warum gehts dann auf dem lokalen Webserver?
            Aber ich glaube ich verstehe, was Du meinst - die Datei wird quasi erstmal komplett über das HTML-Formular hochgeladen, und dann am Server an das Skript übergeben?!? Aber warum klappt das dann lokal?

            Sollte nicht, woher weißt du das es klappt?

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hm... warum gehts dann auf dem lokalen Webserver?
              Aber ich glaube ich verstehe, was Du meinst - die Datei wird quasi erstmal komplett über das HTML-Formular hochgeladen, und dann am Server an das Skript übergeben?!? Aber warum klappt das dann lokal?

              Sollte nicht, woher weißt du das es klappt?

              Struppi.

              Na durchs ausprobieren. Ich klicke im Formular auf senden. Dann beginnt der Upload und ich sehe im Zielverzeichnis wie die Datei langsam wächst. Und im Browser sehe ich die Rückgabe vom Skript, an der ich auch sehe, wie die Datei langsam wächst.

              1. Na durchs ausprobieren. Ich klicke im Formular auf senden. Dann beginnt der Upload und ich sehe im Zielverzeichnis wie die Datei langsam wächst. Und im Browser sehe ich die Rückgabe vom Skript, an der ich auch sehe, wie die Datei langsam wächst.

                ersters ist logisch ich bestreite nicht dass die Datei in Stücken auf den Server geschrieben wird, aber von der Serversoftware und nicht von einem Skript.
                zweiteres ist wohl eher eine Fehldeutung, da, wie gesagt, das Skript (vom Server) erst gestartet wird, wenn die Datei hochgeladen wurde.

                Struppi.

                --
                Javascript ist toll (Perl auch!)
              2. Hell-O!

                Hm... warum gehts dann auf dem lokalen Webserver?

                Weil der Upload nur "virtuell" stattfindet, es wird nichts "transportiert", da sich alles auf dem gleichen Computer abspielt. Du bekommst also zeitlich nichts von dem eigentlichen Uploadvorgang mit.

                Ich klicke im Formular auf senden. Dann beginnt der Upload und ich sehe im Zielverzeichnis wie die Datei langsam wächst.

                Du siehst im Zielverzeichnis, wie der Server den Inhalt des Requests abarbeitet, du siehst aber nicht, wie der Upload abläuft, denn der ist, wie Struppi schon mehrfach schrieb, in dem Moment beendet, indem dein Script startet.

                Der schematische Ablauf via HTTP-Protokoll sieht etwa so aus:

                Client (Browser) [1]:
                Auswahl einer Datei
                Aufbau des HTTP-Requests (inkl. der Daten aus der hochzuladenden Datei)
                Absenden dieses Requests

                Server [2]:
                Entgegennehmen des Requests und Übergeben der Daten an das Perlscript

                Perlscript [3]:
                Extrahieren der hochzuladenden Datei aus dem erhaltenen HTTP-Request und Speichern derselben auf dem Server [4]

                Bei [3] kannst du einen Fortschrittsbalken einbauen, der aber nur den Fortschritt von [4] anzeigt, denn weder von [1] noch von [2] bekommt dein Script irgendwas mit.

                Siechfred

                --
                Hier könnte Ihre Werbung stehen.
                Räucherofen selber gebaut || Das Steuerblog  || RT 221 Erfurt-Altstadt i.V.
                1. Weil der Upload nur "virtuell" stattfindet, es wird nichts "transportiert", da sich alles auf dem gleichen Computer abspielt. Du bekommst also zeitlich nichts von dem eigentlichen Uploadvorgang mit.

                  Öhm... ich hätte mich etwas genauer ausdrücken sollen. Das ganze spielt sich in meinem lokalen Netz ab :-). Da steht also mein Windows-Client und ein Linux-Server, auf dem der Apache läuft. Der Upload findet also tatsächlich statt.
                  Aber ich denke ich habe verstanden, was ihr meint. Dann werde ich um Ajax wohl nicht herumkommen... danke für die ausführlichen Antworten!

                  1. Aber ich denke ich habe verstanden, was ihr meint. Dann werde ich um Ajax wohl nicht herumkommen... danke für die ausführlichen Antworten!

                    Kann man mit AJAX einen Dateiupload realisieren?

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. Kann man mit AJAX einen Dateiupload realisieren?

                      Nein - aber den Fortschrittsbalken :-).

  2. Hallo,

    Ich schreibe die Datei auf den Webserver und lasse ein Skript die aktuelle Größe der Datei auf dem Server auslesen. Die komplette Dateigröße habe ich ja, also kann ich die bereits hochgeladene Prozentzahl errechnen.

    Falls Du CGI.pm verwendest und mit read() den Handler ausliest, ist der Puffer, bzw. das was read() zurückgibt evntl. der bessere Ansatz für den Fortschrittsbalken (hab ich aber noch nicht getestet).

    Ansonsten check mal, ob serverseitig Schreibrechte für den prozess des Webservers auf das Verzeichnis besteht, wohin der Upload geht. Da liegt vermutlich das Problem.

    Tipp für CGI.pm

    use CGI qw(-private_tempfiles);

    Das CGI Modul erlaubt das parsen der Eingaben und stellt fuer das

    Schreiben der Datei auf den Server einen handler zur Verfuegung.

    qw(-private_tempfiles)

    bewirkt dass temporaere Files waehrend des Uploads nicht lesbar sind

    fuer Dritte und dass diese tmpFiles nach den Upload geloescht werden.

    --roro

    1. Hallo,

      Falls Du CGI.pm verwendest

      verwende ich nicht.

      Ansonsten check mal, ob serverseitig Schreibrechte für den prozess des Webservers auf das Verzeichnis besteht, wohin der Upload geht. Da liegt vermutlich das Problem.

      Also der Prozess müßte schon die entspr. Rechte haben, da die Datei ja dann auch im Zielverzeichnis auftaucht... oder verstehe ich das jetzt falsch? Nur die temporäre Datei wird offenbar woanders hingeschrieben.

    2. Ich schreibe die Datei auf den Webserver und lasse ein Skript die aktuelle Größe der Datei auf dem Server auslesen. Die komplette Dateigröße habe ich ja, also kann ich die bereits hochgeladene Prozentzahl errechnen.

      Falls Du CGI.pm verwendest und mit read() den Handler ausliest, ist der Puffer, bzw. das was read() zurückgibt evntl. der bessere Ansatz für den Fortschrittsbalken (hab ich aber noch nicht getestet).

      Wie soll das gehen?
      Wenn das Skript gestartet wird, ist die Datei bereits zu 100% auf dem Server. Also gibt es kein Fortschritt, ergo kein Fortschrittsbalken.

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. hi struppi,

        Wie soll das gehen?
        Wenn das Skript gestartet wird, ist die Datei bereits zu 100% auf dem Server. Also gibt es kein Fortschritt, ergo kein Fortschrittsbalken.

        wie gesagt, ich habs noch nicht getestet. Aber ich hab mal eine Progressbar geschrieben für folgende Aufgabenstellung:

        Ein mainScript startet einige Kindprozesse (SNMP Abfragen auf Router die einige Zeit dauern). Die Childs melden sich an den parent zurück, wenn die sich beenden. Daraus berechnet das parent die Prozente für den Fortschrittbalken, der als Tabelle mit verschieden eingefärbten Zellen, entsprechender Breite als JS ausgegeben wird.

        Genauso dürfte das auch mit der read() Funktion bei einem Upload funktionieren. read() liest einen Handler (das feld type file) häppchenweise ein und schreibt die Datei auf den Server.

        Wenn die abende wieder länger und dunkler werden, teste ich das mal.

        --roro

        1. Genauso dürfte das auch mit der read() Funktion bei einem Upload funktionieren. read() liest einen Handler (das feld type file) häppchenweise ein und schreibt die Datei auf den Server.

          Natürlich kannst du die Datei häppchenweise lesen, aber der Upload ist vorbei und die Datei vollständig auf dem Server, das hat die Serversotfware schon längst erledigt wenn das CGI Skript startet.

          Wenn die abende wieder länger und dunkler werden, teste ich das mal.

          Das ist überflüssig.

          Struppi.

          --
          Javascript ist toll (Perl auch!)