OnkelWou: Ladevorgangsanzeige während PHP Dateiupload

Hallo.
Ich wollte einen Ladebalken anzeigen lassen, der den Uploadfortschirtt in Prozent anzeigt, während man mit PHP eine Datei hochlädt.
Ich hoffe mir kann da jemand ein paar Tipps geben.

Wir kriege ich zB raus, wie viele kb bereits auf den Server übertragen wurden?
Ich weiß ja wie groß meine Datei ist. Nun müsste praktisch mit jedem übertragen kb eine rückmeldung erfolgen, wieviel bereits auf dne Server kopiert wurde. Daraus kann man dann ja sicherlich eine Anzeige generieren oder nicht?

Danke MfG OnkelWou

  1. Hi,

    Ich wollte einen Ladebalken anzeigen lassen, der den Uploadfortschirtt in Prozent anzeigt, während man mit PHP eine Datei hochlädt.

    ich glaube nicht, dass du wirklich "mit PHP eine Datei hochladen willst". Das machst du mit HTTP, ausgelöst durch ein HTML-Formular.

    Wir kriege ich zB raus, wie viele kb bereits auf den Server übertragen wurden?

    Gar nicht.
    Clientseitig (im Browser) geht's nicht, weil du den Vorgang "Browser sendet Request an Server" nicht überwachen kannst, und serverseitig (also im empfangenden PHP-Script) geht's auch nicht, weil das Script erst gestartet wird, wenn der Upload abgeschlossen ist und die Request-Daten komplett beim Server angekommen sind.
    Die einzigen Komponenten in der Geschichte, die etwas über den Fortschritt des Uploads "wissen", sind a) der Browser selbst, der die Daten sendet und b) der Webserver, der sie empfängt.
    Der Browser zeigt den Fortschritt möglicherweise automatisch mit einem Fortschrittsbalken an. Mehr kannst du nicht erwarten ...

    Ciao,
     Martin

    --
    Frauen sind wie Elektrizität: Fasst man sie an, kriegt man eine gewischt.
  2. echo $begrüßung;

    Ich wollte einen Ladebalken anzeigen lassen, der den Uploadfortschirtt in Prozent anzeigt, während man mit PHP eine Datei hochlädt.

    Mit PHP direkt geht das (noch[*]) nicht, aber mit etwas Hilfe von Perl soll man da wohl doch was hinbekommen. Probiert habe ich da selbst noch nicht: Mega Upload

    echo "$verabschiedung $name";

    [*] Gerüchte sprechen davon, dass es mit PHP 6 gehen könnte, aber nichts genaues weiß man noch nicht.

    1. Moin!

      Ich wollte einen Ladebalken anzeigen lassen, der den Uploadfortschirtt in Prozent anzeigt, während man mit PHP eine Datei hochlädt.

      Mit PHP direkt geht das (noch[*]) nicht, aber mit etwas Hilfe von Perl soll man da wohl doch was hinbekommen. Probiert habe ich da selbst noch nicht: Mega Upload

      Keine der denkbaren sogenannten "Lösungen" vermag wirklich zu überzeugen.

      Fakt ist: Der Upload-Request muß erst komplett übertragen sein, bevor der Ergebnis-Response des Servers zurückkommen darf. Das bedeutet, dass man niemals im gleichen Browserfenster, in dem sich das Uploadformular befindet, den Fortschrittsbalken generieren kann.

      Alle "Lösungen" nutzen also ein zweites Fenster (Javascript-Popup, Frameset, IFrame), in dem während des Uploadvorgangs regelmäßig der Fortschritt aktualisiert wird.

      Wobei das natürlich auch wieder blöd ist, denn beständige Fortschrittsbalkenneuladungen beeinträchtigen natürlich den Upload. Außerdem ist die Verwendung eines Session-Mechanismus erforderlich, da man sonst die Balken-Requests nicht dem laufenden Upload zuordnen könnte.

      Es kommen für solche Fortschrittsbalken also gleich drei extrem zweifelhafte Techniken zum Einsatz, auf deren Existenz man sich nicht verlassen kann:
      1. Zweitfenster bzw. Frames, wohlmöglich Javascript
      2. Sessions
      3. Ständige Reloads, wohlmöglich mit Javascript.

      Und das alles nur, weil die Browserhersteller es bis jetzt versäumt haben, dem Browserbenutzer bei eventuell langwierigen Uploadvorgängen durch eine _vernünftige_ Fortschrittsanzeige die Wartezeit zu versüßen.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Hallo,

        Idee, spontan und undurchdacht, geschweige denn ausprobiert:

        • Die hochgeladenen Daten werden irgendwo auf dem Server als temporäre Datei gespeichert
        • Ein Skript könnte die Größe der temporären Datei auslesen und ausgeben
        • Die Webseite könnte dieses Skript regelmäßig aufrufen und die Größe der bisher hochgeladenen Daten anzeigen(AJAX)

        Meinung?

        Viele Grüße

        Henk Strobel

        1. Moin,

          Idee, spontan und undurchdacht, geschweige denn ausprobiert:

          • Die hochgeladenen Daten werden irgendwo auf dem Server als temporäre Datei gespeichert
          • Ein Skript könnte die Größe der temporären Datei auslesen und ausgeben
          • Die Webseite könnte dieses Skript regelmäßig aufrufen und die Größe der bisher hochgeladenen Daten anzeigen(AJAX)

          eine innere Stimme sagt mir, dass genau dieses Konzept erst vor ein paar Tagen schonmal erörtert wurde ... Ah, da isses ja.

          Meinung?

          Problem: Du bist darauf angewiesen, dass der Browser andere Ereignisse (z.B. über setTimeout() durch Javascript) bearbeitet, während er die Formulardaten zum Server schaufelt.
          Schönheitsfehler: Wie Sven schon sagte, die permanente Abfrage des aktuellen Upload-Fortschritts erzeugt zusätzlichen Traffic und verlangsamt den eigentlichen Upload-Vorgang.

          So long,
           Martin

          --
          Der Stress von heute ist die gute alte Zeit von morgen.
          1. Moin,

            Problem: Du bist darauf angewiesen, dass der Browser andere Ereignisse (z.B. über setTimeout() durch Javascript) bearbeitet, während er die Formulardaten zum Server schaufelt.

            Bei heute üblichen Rechenleistungen sollte das IMHO kein wirkliches Problem darstellen.

            Schönheitsfehler: Wie Sven schon sagte, die permanente Abfrage des aktuellen Upload-Fortschritts erzeugt zusätzlichen Traffic und verlangsamt den eigentlichen Upload-Vorgang.

            Der Traffic dürfte im Vergleich zum Upload sehr gering sein, wenn man davon ausgeht, das ein Fortschrittsbalken wohl nur für hinreichend große Dateien Sinn macht.

            Es bleibt also abzuwägen, wie wichtig einem diese Funktionalität wirklich ist. In den meisten Fällen würde mir auch eine Meldung à la "Datei wird hochgeladen" (ohne Fortschrittsbalken o.ä.) reichen.

            Das größte Problem ist für mich eigentlich die Neigung der User, den Submit-Button x-mal zu klicken, weil angeblich nichts passiert ;-)

            Viele Grüße

            Henk Strobel

        2. Moin!

          • Die hochgeladenen Daten werden irgendwo auf dem Server als temporäre Datei gespeichert

          Das werden sie in der Tat. Bei PHP sind diese temporären Dateien schon fertig hochgeladen, wenn das Skript gestartet wird.

          • Ein Skript könnte die Größe der temporären Datei auslesen und ausgeben

          Wenn das Skript dann noch weiß, wie groß die Datei insgesamt ist, wäre auch der Fortschritt anzeigbar.

          • Die Webseite könnte dieses Skript regelmäßig aufrufen und die Größe der bisher hochgeladenen Daten anzeigen(AJAX)

          Das ist eben das Problem. Mit AJAX auf der Formularseite könnte zu Problemen führen, weil man sich da im Niemandsland befindet. Denn die alte Seite ist schon "ungültig", weil der Request für die neue Seite schon raus ist, und die neue Seite läßt noch auf sich warten, weil der Upload noch andauert.

          Darf man auf einer Seite, die schon durch "onunload" durch ist, mit Javascript (und insbesondere mit komplexeren Objekten wie XMLHttpRequest) noch operieren? Ich würde es nicht versuchen wollen, auf die Idee käme ich gar nicht.

          Der Punkt ist einfach: Der Browser weiß genau, wie groß die lokale Datei ist, und wieviel von den Formulardaten er schon zum Server geschickt hat. Warum zum Teufel kriegen die Browserhersteller dann keinen Fortschrittsbalken implementiert? Oder ist von denen noch nie einer auf diese Idee gekommen?

          Gewiß: Jede Art von Umsetzung bedeutet, dass es tausend Benutzern (insbesondere aus der Fraktion uploaderstellender Nörgler) nicht gefällt, insbesondere optisch. Denen gefällt ja auch der Anmeldedialog für HTTP-Authentifizierung nicht.

          Es sagt ja auch niemand, dass der Balken riesig groß werden muß - aber irgendwo einen Indikator für "Halte ein, mein User, ich bin tatsächlich noch am hochladen - es passiert tatsächlich etwas!" sollte doch mal drin sein. Und der sollte anders aussehen als das übliche "Tja, warten wir mal, ob und wann der Server was sagt...".

          - Sven Rautenberg

          --
          "Love your nation - respect the others."