Dennis Lenke: File Upload mit Upload-Statusanzeige

Hallo Leute,

kennt jemand eine Möglichkeit einen File Upload mit Anzeige des aktuellen Uploadstatus (Anzahl der aktuell übertragenen Bytes oder Fortschrittsbalken o.ä.) in Perl oder
Javascript zu realisieren.

Besten Dank für die Tips im voraus.

M.f.G. Dennis

  1. Hi,

    kennt jemand eine Möglichkeit einen File Upload mit Anzeige des aktuellen Uploadstatus (Anzahl der aktuell übertragenen Bytes oder Fortschrittsbalken o.ä.) in Perl oder
    Javascript zu realisieren.

    ein Perl-Script wird erst gestartet, wenn die Daten komplett auf dem Server angekommen sind, und dann lautet die Anzeige 100%. JavaScript kann da auch wenig tun, weil es höchstens die Zustände "fertig" und "nicht fertig" kennt.

    Anders gesagt: No way.

    Cheatah

    1. Hallo,

      ein Perl-Script wird erst gestartet, wenn die Daten komplett auf dem Server angekommen sind, und dann lautet die Anzeige 100%. JavaScript kann da auch wenig tun, weil es höchstens die Zustände "fertig" und "nicht fertig" kennt.

      Anders gesagt: No way.

      hmm, Cheatah, ich hatte spontan das gleiche gedacht... aber ganz vielleicht... mit schmutzigen Tricks...

      Idee: Du zeigst den Status mit Hilfe eines Bilds an wie das auch bei manchen Conter-Statistiken gemacht wird. Dieses Bild liegt in einem Frame oder so, was alle paar Sekunden einen Refresh macht... Das Bild / Balken wird dynamisch per cgi vom Server generiert.

      Nun muesste man "nur noch" auf dem Server durch wahrscheinlich etwas "ungewoehnliche" Aktionen herausfinden koennen, wie viele Bytes genau in dem Moment fuer eine bestimmte Domain bereits uebertragen wurden. Die Frage ist also "nur": wie kann man per cgi herausfinden, wie viele Daten einer bestimmten Datei bereits uebertragen wurden?

      Dirk

      1. Hallo,

        »»... Die Frage ist also "nur": wie kann man per cgi herausfinden, wie viele Daten einer bestimmten Datei bereits uebertragen wurden?

        Das ist ja das Problem, Das CGI-Script tritt erst _nach_ der vollständigen Übertragung in Aktion. Vorher weiß es nicht mal das jetzt was passieren wird, weils nocht gar nicht läuft. Nicht mal der Server kann da was machen, da das HTTP-Protokoll vorsieht: Erst den ganzen Request, dann die ganze Antwort. Einzig der Browser wäre grundsätzlich in der Lage, was zu machen. aber der tut's anscheinend nicht.

        Naja, Der IE 5.5 macht zwar irgendwas in der Statusleiste, aber so genau nimmt er's anscheinend auch nicht. NN 4.74 und opera 4 macht nichts, soweit ich es auf die schnelle eruieren konnte

        Grüße
          Klaus

        1. Hi,

          Das ist ja das Problem, Das CGI-Script tritt erst _nach_ der vollständigen Übertragung in Aktion. Vorher weiß es nicht mal das jetzt was passieren wird, weils nocht gar nicht läuft. Nicht mal der Server kann da was machen, da das HTTP-Protokoll vorsieht: Erst den ganzen Request, dann die ganze Antwort. Einzig der Browser wäre grundsätzlich in der Lage, was zu machen. aber der tut's anscheinend nicht.

          Geht es wirklich nur um die Statusleiste? Ich dachte, es koennte auch so was sein wie bei Netscape mit dem Smart-Download: ich klicke auf den Download-Link, der Browser macht ein weiteres Status-Window auf und zieht parallel die Datei vom Server. In dem Status-Window kann ich dann parallel alles moegliche anzeigen lassen...

          Dirk

          1. Hi,

            Geht es wirklich nur um die Statusleiste?

            es ist eigentlich egal, wo Du die Zahl anzeigen willst - Du kannst sie nicht ermitteln!

            Ich dachte, es koennte auch so was sein wie bei Netscape mit dem Smart-Download: ich klicke auf den Download-Link, der Browser macht ein weiteres Status-Window auf und zieht parallel die Datei vom Server. In dem Status-Window kann ich dann parallel alles moegliche anzeigen lassen...

            Das ist es, was klaus mit "Einzig der Browser wäre grundsätzlich in der Lage, was zu machen." meinte. Im Download-Fenster tut der Browser exakt dies, an anderer Stelle gibt er die Information einfach nicht preis.

            Cheatah

            1. *schmunzel* Noch nen Versuch ;-)

              Das ist es, was klaus mit "Einzig der Browser wäre grundsätzlich in der Lage, was zu machen." meinte. Im Download-Fenster tut der Browser exakt dies, an anderer Stelle gibt er die Information einfach nicht preis.

              Ich meinte auch nicht, dass der Browser das rausruecken soll, sondern der Server. Ok, ist nur eine Idee, aber kann ich irgendwie zB aus einem Apache "herauskitzeln", wie weit er eine Datei schon uebertragen hat? Irgendwo tief in den Logs vielleicht? Dann kann ich aus dieser Information _waehrend der Uebertragung_ parallel zB ueber ein cgi eine Information an den Client zurueckgeben...

              Ok, bleibt weiter Spekulation, so lange nicht klar ist, ob die Server so was 'rausruecken...

              Dirk *heute im "Baeh! ich will aber"-Modus ;-)*

              1. Hallo Dirk,

                [...] Ok, ist nur eine Idee, aber kann ich irgendwie zB aus einem Apache "herauskitzeln", wie weit er eine Datei schon uebertragen hat? Irgendwo tief in den Logs vielleicht? Dann kann ich aus dieser Information _waehrend der Uebertragung_ parallel zB ueber ein cgi eine Information an den Client zurueckgeben...

                Ich bin mir nicht ganz sicher, aber soweit ich mod_perl verstanden habe (und ich bin noch nicht weit vorgedrungen ;-) ist es nicht nur ein Modul, daß Skripts schneller laufen läßt, weil es diese im Speicher hält, sondern auch eine "Schnittstelle", um mit Perl tief in die Interna vom Apache vorzudringen. Vielleicht findet sich ja was bei http://perl.apache.org/ das Deinen Wünschen zumindest nahe kommt :-)

                Gruß AlexBausW

              2. Ich meinte auch nicht, dass der Browser das rausruecken soll, sondern der Server. Ok, ist nur eine Idee, aber kann ich irgendwie zB aus einem Apache "herauskitzeln", wie weit er eine Datei schon uebertragen hat? Irgendwo tief in den Logs vielleicht? Dann kann ich aus dieser Information _waehrend der Uebertragung_ parallel zB ueber ein cgi eine Information an den Client zurueckgeben...

                Schau mal Dirk,

                Das kann der Server nicht.  Es läuft so:
                Der Browser sagt dem Server: 'Tuwas, aber rasch!!!' und sagt ihm dann gleich mal alles was er sonst noch so an Informationen hat (auch den Dateiinhalt!). Dabei läßt er sich vom Server überhaupt nicht dreinquatschen, weil wo sind wir den, oder?
                Dann wartet der Bowser, bis was retour kommt, falls was retour kommt.

                Der Server sagt dann am Schluß: 'Ende der Fahnenstange!' und weg ist die Verbindung.

                Ganz einfach: "einmal hin und einmal retour und tschüss".Das wird nicht anders und wenn Du noch so willst.

                Und noch was, weiß irgendwer, wie ein Proxy das mit dem Request so macht? Der Browser kann vielleicht schon alles abgeschickt haben, der Server weiß dabei noch gar nicht, daß jemand etwas von ihm will. Theoretisch ist sowas durchaus denkbar.

                Das ist so wie in diesem Forum:
                Du kannst ja auch nicht gerade _jetzt_ mitlesen, was ich gerade eintippe, inklusive aller Korrekturen und Rechtschreibfhlern und tastatur-ausrutschern und so.
                Du kannst einfach nur warten bis ich fertig bin und das Fromular absende, der Server das ganze noch wesentlich hübscher macht, damit Du deine Freude am Lesen hast.
                Und dreinschreiben kannst Du mir auch nicht. (hehehe)

                Kurz und schlecht: der Server kanns nicht, weil das Protokoll es nicht zuläßt.

                Grüße
                  Klaus ( der gerade in den  "na wird doch nicht so schlimm sein"-Modus gewechselt hat :-)

                1. Hi Klaus,

                  *traenenausaugenwisch* Danke! Du hast meinen Feierabend gerettet ;-)

                  *rotfl* Dirk

                  Ps: Kann man solche Erklaerungen auch nach news://de.alt.netdigest schicken? Cheatah, walte Deines Amtes ;-)

                  PPs: Und dann stellte sich heraus, dass der Autor des ersten Postings ganz was anderes gemeint hat... oder Dennis?

                  1. Hi,

                    *traenenausaugenwisch* Danke! Du hast meinen Feierabend gerettet ;-)

                    mir übrigens auch :-)

                    Ps: Kann man solche Erklaerungen auch nach news://de.alt.netdigest schicken?

                    Nein, schon alleine wegen

                    --- boq ---
                    D:>ping de.alt.netdigest
                    Ungültige IP-Adresse de.alt.netdigest.

                    D:>tracert de.alt.netdigest
                    Zielsystemname de.alt.netdigest kann nicht ausgewertet werden.

                    D:>
                    --- eoq ---

                    Dafür aber an news:de.alt.netdigest ;-)

                    Cheatah, walte Deines Amtes ;-)

                    Done :-)

                    Cheatah

  2. Hi,

    kennt jemand eine Möglichkeit einen File Upload mit Anzeige des aktuellen Uploadstatus (Anzahl der aktuell übertragenen Bytes oder Fortschrittsbalken o.ä.) in Perl oder
    Javascript zu realisieren.

    wie Cheatah schon sagte: Nicht, ohne an den Grundvoraussetzungen zu rütteln.
    HTTP ist nun mal kein Protokoll, mit dem man elegant Sessions realisieren kann. Genau so etwas bräuchtest Du aber: Eine Session, also die Möglichkeit, während einer erkennbar zusammenhängenden Phase der Verarbeitung zwischendurch immer wieder selbst die Kontrolle über das Aussehen der Browser-Darstellung übernehmen zu können.

    Naheliegenderweise könnte das funktionieren, wenn Du z. B. mit Java eine stehende Verbindung zum Server etablierst und einzelne Pakete (sagen wir mal: 4kB) auf die Reise schickst. Du kannst dann immerhin protokollieren, wieviel Du abgeschickt hast.
    Wenn Du nach jedem Absenden auch noch auf eine Bestätigung (acknowledge) vom Server wartest, dann bekommst Du sogar zuverlässige Angaben über die tatsächlich angekommene Datenmenge - so ähnlich stelle ich mir die Protokollierung via FTP vor.
    Allerdings kostet ein solches Protokoll natürlich Overhead - und auf beiden Seiten der Leitung muß ein Programm laufen, welches dieses Protokoll beherrscht.

    Würde der Rechner Deines Anwenders seinem Browser erlauben, mit Hilfe eines in ihm laufenden Programms gezielt (!) auf eine Datei der Festplatte zuzugreifen (genau das, was die Virenprogrammierer gerne hätten ...), dann könntest Du folgendes tun: Einen Abschnitt der Datei lesen, diesen via CGI "nach oben" schicken, auf die Antwort warten (diese besteht aus einem HTML-Dokument mit Zustandsanzeige) und dann (z. B. per JavaScript-onload) den nächsten Abschnitt schicken (von Aufruf zu Aufruf müßten die HTML-Seiten den Offset innerhalb der zu versendenden Datei durchreichen).
    Das wäre furchtbar unelegant - aber das liegt nun mal daran, daß HTTP drunter liegt.

    mfG - Michael