Bürgle: Prüfen, ob/wann ein Download beendet wurde.

Hi!
Zunächst:Im Archiv fand ich zwar was, aber es half mir nicht wirklich weiter.

Ich habe eine Webseite gemacht, auf der u.a. Programme zum Download bereitgestellt werden.
Nun soll in eine MySql-Tabelle eingetragen werden, wer, wann was geladen hat.
(Das ganze ist ein Userbereich mit Session... .)
Ich leite per Link zum Download auf eine PHP-Datei um, bei der ich u.a. folgendes gemacht habe:

<meta http-equiv="refresh" content="0; url=<?echo $file;?>">
($file enthält Pfad/Dateiname.exe, das nur am Rande.)

Alternativ biete ich den Download auch noch als Link via Javascript an:

function startedownload()
{
location.href="<?echo $file?>";
}

(Falls meta-refresh nicht geht).

Das alles geht soweit ohne Probleme.
Nun wäre es mir sehr recht, wenn ich auch noch mitbekommen könnte, ob/wann der User mit dem Download fertig ist.
Kann mir jemand einen Tipp dazu geben?
Ich würd nach dem Download nämlich gerne auf eine weitere Seite umleiten ("Übertragung erfolgreich beendet...") und dabei noch ein entsprechendes Flag in der Datenbank setzen, um zu wissen, dass der User die Datei hat (mal abgesehen von Ausnahmen).

PS: Bitte keine Hinweise, warum ich das alles vom user wissen will und das ich das lassen soll und was ist, wenn jemand kein Javascript hat und und und :)

Grüße, Bürgle
http://www.benotung.de--

IE - No risk, no fun.

  1. Hallo Bürgle,

    Nun wäre es mir sehr recht, wenn ich auch noch mitbekommen könnte, ob/wann der User mit dem Download fertig ist.

    Hmm, war da nicht mal was von wegen "HTTP ist ein statisches Protokoll"?
    Daten werden dabei einmal übertragen und es besteht keine dauerhafte Verbindung zwischen Server und Client.
    Das bedeutet, du hast keine zuverlässige Möglichkeit, das zu prüfen. Was du machen kannst, ist, eine Art "Zeitschaltuhr" einzubauen (die mit Javascript realisiert werden könnte), die nach Ablauf einer bestimmten Zeit eine andere Seite aufruft. Das ist aber wie gesagt nicht zuverlässig.

    Grüße aus Darmstadt,
    Benjamin

  2. Halihallo Bürgle

    Das alles geht soweit ohne Probleme.
    Nun wäre es mir sehr recht, wenn ich auch noch mitbekommen könnte, ob/wann der User mit dem Download fertig ist.
    Kann mir jemand einen Tipp dazu geben?
    Ich würd nach dem Download nämlich gerne auf eine weitere Seite umleiten ("Übertragung erfolgreich beendet...") und dabei noch ein entsprechendes Flag in der Datenbank setzen, um zu wissen, dass der User die Datei hat (mal abgesehen von Ausnahmen).

    Es gibt _keine_ Möglichkeit zu überprüfen, ob ein Download beim Client angekommen ist oder nicht. Ob eine Weiterleitung zu einer weiteren Seite geht, bezweifle ich auch (ein HTTP-Refer wird wohl nicht gehen, da dann der Kunde sozusagen die "Übertragung erfolgreich" - Meldung als Download-file abgespeichert bekommt). Wäre möglich, dass du den Download-Stream des Files über PHP realisierst und am Ende das Flag in der DB setzt, jedoch ist diese Information ganz und gar irrelevant, da dadurch keineswegs sichergestellt ist, dass der Download auch angekommen ist. Ich sehe für deine Aufgabenstellung keine Möglichkeit der Umsetzung, so leid's mir tut.
    In einem Request kann lediglich eine "Nachricht" übertragen werden, also _entweder_ Download-File _oder_ "Übertragung erfolgreich"-Meldung, nicht jedoch beides.

    Viele Grüsse

    Philipp

  3. Hallo,

    ich hab mich mal an etwas ähnlichem _versucht_ und kann Dir zumindest die gedanklichen Ansätze verraten, die ich damals hatte:

    1. Der Webserver schreibt ein Logfile (macht er normalerweise sowieso). Dorthin notiert er u.a. IP, Dateiname und HTTP-Status-Code.

    2. Wenn wir davon ausgehen, dass IP und Dateiname bekannt sind, sollte es möglich sein etwas zu schreiben, dass das Logfile parst und darauf "wartet", dass für die gewünschte IP/Dateinamen-Kombination der Status "200" erscheint.

    Ich habe diesen Ansatz nie weiterverfolgt, weil er mehrere Probleme mit sich zieht:

    a) Ziemliche CPU-Last auf dem Server
    b) Wie soll die Abbruchbedingung für das Logfile-Parsen sein?
    c) Das eigentliche Killer-Gegenargument: Was mache ich mit fragmentierten Downloads, wie sie von Download-Managern erzeugt werden?

    Grüße,

    Utz

    1. Hi, vielen Dank erstmal.

      Ich habe diesen Ansatz nie weiterverfolgt, weil er mehrere Probleme mit sich zieht:

      a) Ziemliche CPU-Last auf dem Server
      b) Wie soll die Abbruchbedingung für das Logfile-Parsen sein?

      Hmmm...am effektivsten wäre wohl, das Logfile nur alle paar Stunden komplett zu parsen und alle Zeilen, die matchen, nachträglich in der Datenbank entsprechend zu verwursteln.
      Damit wäre auch Problem a) nimmer so oft der Fall.

      Aber man sich dann ja noch die IP in der Datenbank merken und vergleichen... alles in allem sehr unkomfortabel.
      Ich wüsste nicht mal, wie ich ein Trigger basteln könnte, der z.B. alle 3 Stunden loslegt.
      Und was ist, wenn das Logfile ersetzt wird?

      c) Das eigentliche Killer-Gegenargument: Was mache ich mit fragmentierten Downloads, wie sie von Download-Managern erzeugt werden?

      Keine Ahnung, Du meinst sowas wie aufteilen in mehrere Stücke durch Programme wie Gozilla?

      Vom Prinzip her ist das ganze aber durchaus eine interessante Idee!

      Grüße, Bürgle
      http://www.benotung.de

      --

      IE - No risk, no fun.
      1. Hallo,

        c) Das eigentliche Killer-Gegenargument: Was mache ich mit fragmentierten Downloads, wie sie von Download-Managern erzeugt werden?
        Keine Ahnung, Du meinst sowas wie aufteilen in mehrere Stücke durch Programme wie Gozilla?

        Genau - wenn ich mich recht entsinne erzeugen die pro Download 'ne ganze Batterie von Logfile-Einträgen, alle mit "Partial Content"-HTTP-Status - also komplett unbenutzbar für irgendeine vernünftige Auswertung.

        Grüße,

        Utz

        1. Hi Utz,

          Genau - wenn ich mich recht entsinne erzeugen die pro Download 'ne ganze Batterie von Logfile-Einträgen, alle mit "Partial Content"-HTTP-Status - also komplett unbenutzbar für irgendeine vernünftige Auswertung.

          was ist daran unbenutzbar?

          Du kannst die HTTP-Zustände 200 und 206 unterscheiden, und jede dieser Meldungen enthält die Anzahl von Bytes, die ausgeliefert wurden. Du kannst also sogar ausrechnen, ob alle Stücke zusammen die erwartete Gesamtgröße ergeben haben.

          Viele Grüße
                Michael

          --
          T'Pol: I meant no insult.
          V'Lar: Of course not. You're simply speaking your mind ... as you always have.
          1. Hi Michael,

            Du kannst die HTTP-Zustände 200 und 206 unterscheiden, und jede dieser Meldungen enthält die Anzahl von Bytes, die ausgeliefert wurden. Du kannst also sogar ausrechnen, ob alle Stücke zusammen die erwartete Gesamtgröße ergeben haben.

            Da hast Du auch wieder recht, daran hab ich noch gar nicht gedacht :-)

            Dann wäre ja Bürgles Problem tatsächlich auf die Art und Weise zu lösen: ein Skript parst das Logfile nach IP/Dateinamen-Kombinationen. Findest es HTTP-Status 200, notiert es "downgeloadet", findet es 206, sucht es alle 206-Einträge der IP/Dateinamen-Kombination zusammen, addiert die Bytes zusammen, vergleicht das Ergebnis mit der tatsächlichen Größe der Datei, und wenn es passt, notiert es ebenfalls "downgeloaded".

            Grüße,

            Utz

  4. Hi!

    Vielen Dank für die Beiträge, ich denk ich lass das ganze und gehe davon aus, dass die meisten User nach dem Beginn den Download auch tatsächlich haben. Der Aufwand, um die Wahrheit zu erfahren ist einfach zu groß bzw. kaum 100%ig möglich.

    Grüße, Bürgle
    http://www.benotung.de

    --

    IE - No risk, no fun.