Andreas Korthaus: /FTP/HTML: Upload-Status mit flush() anzeigen

Hallo!

Es wird ja oft hier angefragt, wie man den Downloadstatus einer Datei mit Javascript anzeigt. Normal ist das nicht möglich, aber bei mir vielleicht schon, nur weiß ich noch nicht genau wie ich die Ausgabe generieren soll.
Und zwar habe ich ein PHP-Script, welches per ftp einige Dateien auf einen anderen Server hochläd. Da der Server auf dem mein PHP läuft nur mit DSL(upstream 16K) angebunden ist, dauert das schonmal eine weile, das kann durch aus mehrere Minuten dauern, die Timeouts habe ich alle dem entsprechend erhöht.
So. Mit php kann ich ja mit flush() die Ausgabe schon vorab an den Browser schicken, ich weiß, nicht 100%ig, aber ich habe es mit einem echo ".";
fluch();
nach jedem erfolgreichen Upload getestet und das funktioniert wunderbar, wie ein Statusbalken, sieht halt nur so aus wie eine Statusanzeige aus C64 Zeiten ;-)

Jetzt meine Frage, wie kann ich das etwas ansprechender gestalten, wohl am besten mit Javascript, oder geht das nicht? Ich habe bis dahin ja erst einen Teil des Quellcodes, jetzt könnte ich halt irgenwas übertragen das den Browser dazu anregt irgendwie eine Grafik in einem div oder was auch immer, größer anzuzeigen, obwohl das html-Dokument noch lange nicht komplett ist. Versteht Ihr was ich meine? So das es aussieht wie ein normaler Statusbalken. Oder eine Tabelle deren Hintergrund sich spaltenweise nach und nach füllt. Ich kann ja keine Tabelle nach und nach laden, denn erst wenn </table> übertragen wurde fängt der Browser an eine Tabelle anzuzeigen. Hat jemand vielleicht einen Tipp wie ich sowas realisieren könnte? Das das nicht in allen Browsern geht ist egal, Hauptsache in IE > 5 und Mozilla, ist nicht für ein öffentliches Puplikum bestimmt.

Und nochwas anderes, ich gebe immer Statusmeldungen aus, halt am Anfang, nach dem ermitteln der Dateien und am Ende. Die stehen dann auch wie in der Shell hinterher alle untereinander. Kann ich nicht da auch mit hife von Javascript und vielleicht Ebenen die neue Statusmeldung über der alten anzeigen?

Bin für jeden Tipp dankbar!

Viel Grüße
Andreas

  1. Hallo,

    Hat jemand vielleicht einen Tipp wie ich sowas realisieren könnte? Das das nicht in allen Browsern geht ist egal, Hauptsache in IE > 5 und Mozilla, ist nicht für ein öffentliches Puplikum bestimmt.

    Hab' ich jetzt nicht getestet, müsste aber mit den angegebenen Browsern klappen.

    --- gaaaanz am Anfang ---
    echo "<div id="uploadstatus"></div>\n";
    -------------------------
    (diese <div> natürlich mit CSS irgendwo in die Mitte positionieren)

    --- jedes mal, wenn sich irgendwas verändert -----
    echo "<script type="text/javascript">\n<!--\n";
    echo "document.getElementById('uploadstatus').innerHTML = 'Hochgeladen: " . $transfered_kilobytes . ' KB';\n";
    echo "\n//-->\n</script>\n";
    flush (); // und nicht fluch ;)
    -------------------------------------------------

    --- am Ende --------------------------
    echo "<script type="text/javascript">\n<!--\n";
    echo "document.getElementById('uploadstatus').style.visibility = 'hidden';\n";
    echo "\n//-->\n</script>\n";
    --------------------------------------

    Grüße,

    Christian

    1. Hi Christian!

      Leider ist das ganze etwas langsam, aber das war ja vorher klar, sonst ist es perfekt, danke Dir! Das einzige was jetzt noch stört ist das manchmal die Ebene nur einige Millisekunden angezeigt wird. Könnte man da noch irgendeinen timeout einbauen, das man sagen könnte eine Ebene soll mindestens 1 Sekunde angezeigt werden bevor was anderes passiert? ODer diese Information aus PHP mitgeben, wenn ich weiß das eine Eben nur ganz kurz angezeigt weden wird, dann eine funktin einfügen die die Anzeigedauer "künstlich" verlängert? Mit einem window.timeout geht geht es glaube ich nicht. Dummerweise habe ich deshalb bereits einen neuen Thread aufgemacht </?m=138300&t=25210> obwohl das glaube ich besser hierhin passen würde, sorry!

      Grüße
      Andreas

      1. Hallo,

        was - Du auch noch ein Doppelposter -- das geht so nicht weiter ... ;-)

        Nun ja: Du kannst Dir ja die Zeit (als Timestamp) in PHP merken, wann das letzte mal was ausgegeben wurde und nur dann etwas ausgeben, wenn mindestens 1 sec. verstrichen ist (beim Web evtl. auch 2)

        --- start
        $last_output = 0;

        --- im code
        $curr_time = time();
        if (($curr_time - $last_output > 1) || ($curr_time - $last_output < 0)) {
          $last_output = $curr_time;
          echo .....;
        }

        (das < 0 brauchst Du, damit, falls die Serverzeit verstellt wird, er keinen Murks macht und gar nichts mehr anzeigt; ist zwar extrem selten, dass so etwas passieren könnte, aber man weiß ja nie)

        Grüße,

        Christian

        1. Hi!

          was - Du auch noch ein Doppelposter -- das geht so nicht weiter ... ;-)

          sorry!

          Nun ja: Du kannst Dir ja die Zeit (als Timestamp) in PHP merken, wann das letzte mal was ausgegeben wurde und nur dann etwas ausgeben, wenn mindestens 1 sec. verstrichen ist (beim Web evtl. auch 2)

          Ja, und was mache ich wenn die Spanne kleiner ist als 1 Sekunde? Das ist ja das Problem! OK, könnte dasselbe ausführen mit einem sleep(1); davor oder halt eine Schleife die so lange läuft, aber das will ich wenn möglich vermeiden, so wichtig ist die Ausgabe auch nicht, die Performance des Scriptes hat auf alle Fälle Vorrang, und sleep() stoppt das Script ja komplett, Browser-seitig wäre das egal, aber anscheinend geht das nicht.
          Wenn ich einfach weitermache fehlt mir dann ja diese Ausgabe! Ich weiß ja nicht ob man in PHP so ein Art Warteschlange hinbekommt, die parallel zum restlichen Script läuft.

          Grüße
          Andreas

          1. Hallo,

            Ja, und was mache ich wenn die Spanne kleiner ist als 1 Sekunde? Das ist ja das Problem!

            Verstehe ich nicht - es geht ja um die KB-Anzeige, oder? Dann ist es ja egal, ob Du die Anzeige mehrmals überspringst ...

            Ich weiß ja nicht ob man in PHP so ein Art Warteschlange hinbekommt, die parallel zum restlichen Script läuft.

            Nein, PHP kann kein Threading [1] - du könntest es höchstens versuchen, teilweise nachzubilden.

            Grüße,

            Christian

            1. Hallo,

              Nein, PHP kann kein Threading [1] - du könntest es höchstens versuchen, teilweise nachzubilden.

              Arrgh - jetzt wollte ich noch eine Fußnote [1] darunter schreiben, dass ich die POSIX-Erweiterung zwar kenne (http://www.php.net/manual/de/ref.pcntl.php), aber die gibt's nur unter Unix.

              Grüße,

              Christian