JS: setTimeout verhält sich anders als im IE und Opera?

  • Hallo!

    Ich bin gerade dabei, für verschiedene Musikseiten einen Download Counter für mp3s mittels php zu realisieren, was soweit auch schon gut funktioniert.

    Ich öffne hierzu ein javascript popup, das wiederum per php das mp3 file
    zum download schickt.
    Allerdings möchte ich auch, dass das Popup danach wieder automatisch geschlossen wird, wie kann ich das realisieren?

    Als workaround habe ich es im Moment so gelöst:

    function checkDlWnd(){
    setTimeout("dlwnd.close()", 4000);
    if(!dlwnd.closed){
    setTimeout("checkDlWnd()", 2000);
    }
    }

    Das funktioniert allerdings nur im IE und im Opera, aber seltsamerweise nicht im Firefox. Kann mir jemand helfen?

    Gibt es vielleicht sogar eine elegantere Lösung, kann man den Download-Dialog evtl. sogar direkt ansprechen?

    Die bisherige Lösung im Ganzen gibt es hier:

    http://cynicism.bew-music.de/test.html

    MfG
    Bernd

  • Zitat von Dr. Evil

    Bei mir funktioniert das soweit. Das einzige Problem, das ich sehe ist, dass die Download-Bestätigung wenn man sie nicht innerhalb deiner 4 Sekunden bestätigt zusammen mit dem Popup zugeht.
    auch sonst weiß ich nicht so ganz, wozu du das Popup überhaupt brauchst...


    Bei mir bleibt die Download-'Bestätigung' so oder so offen...

    Allerdings versteh ich es auch nicht, warum du ein Popup machst. Das braucht doch nur zeit, bis das aufgeht. Wenn du direkt auf die Datei verlinkst kommt nur das Fensterchen, das dich fragt, wohin es das speichern soll. Schnell, effizient und elegant.

    Signaturen sind doof.

  • Hallo!

    hmm, also im firefox bleibt das bei mir leider nicht offen, keine ahnung, warum.

    wie es ohne popup gehen soll, verstehe ich leider nicht (ist mein erster versuch, mit php was zu machen).
    wie kann ich denn ohne popup das skript aufrufen, dass mir den zähler erhöht, aber gleichzeitig dem user den download dialog gibt?

    (ok, das ist jetzt vielleicht die falsche frage in diesem forum, aber ich stell sie trotzdem mal)

    gruß
    Bernd

  • Mach dir z.B. eine php-Datei download.php, die du z.B. so aufrufst:

    download.php?filename=xyz.zip

    Die download.php liefert dann beim Öffnen die Datei als Download zurück (Stichwort Content-Dispostion, etc.) und zählt gleichzeitig auch noch irgendeinen Zähler hoch.

    Ganz banaler (natürlich so nicht funktionierender) Aufbau:

    PHP
    <?php
    header("content-disposition: attachment; filename=" . basename($_GET["filename"])); //Sorgt für Download-Fenster
    header("content-type: application/octet-stream");
    $filename = "./filebase/" . basename($_GET["filename"]);
    print file_get_contents($filename);
    counter_hoch();
    ?>

    Verbessern solltest du das noch mit mod_rewrite, damit du nicht immer ne Download.php als Dateinamen hast, sondern ganz normal auf xyz.zip verlinken kannst

  • das mit dem sichern hab ich mir schon gedacht, aber außer, dass ich das verzeichnis sichere (suche nach '/' in title) werd ich nix weiter brauchen, weil das nicht per datenbank und passwort läuft. die mp3s sind ja frei verfügbar, die darf und soll man sich ruhig runterladen. es interessiert lediglich, wie oft das gemacht wurde (ja mir ist klar, dass man das umgehen kann, aber wer macht sich den aufwand schon)

    danke jedenfalls für eure hilfe, ich habs jetzt endlich kapiert, wie ichs machen muss.

    gibt es bald zu sehen unter:
    http://www.blindflugonline.de
    http://www.cynicism.de
    http://www.shapeshift-music.de
    und
    http://www.refuge-band.de

    viele grüße an alle helfenden
    Bernd

  • Zitat von Dr. Evil

    lustig wird's wenn dann ein Script-Kiddie das hier runterlädt:

    Code
    download.php?filename=download.php

    dann kann er sich den Quellcode des Scriptes und damit vermutlich ein Datenbank-Passwort besorgen.

    Das Script muss also UNBEDINGT gesichert werden.

    Sicher, wenn du aber meinen Code lesen und verstehen würdest, würdest du sehen, dass das nicht geht. Zugelassen sind a) nur Dateien ohne Ordnerangaben etc. (die Ordnerangaben werden durch basename() einfach weggeschmissen) außerdem wird der Pfad "filebase/" davorgesetzt, man darf also nur Dateien aus diesem Ordner runterladen in dem natürlich keine evtl. gefährlichen PHP-Dateien sein sollten.

  • Zitat von JonHa

    Sicher, wenn du aber meinen Code lesen und verstehen würdest, würdest du sehen, dass das nicht geht. Zugelassen sind a) nur Dateien ohne Ordnerangaben etc. (die Ordnerangaben werden durch basename() einfach weggeschmissen) außerdem wird der Pfad "filebase/" davorgesetzt, man darf also nur Dateien aus diesem Ordner runterladen in dem natürlich keine evtl. gefährlichen PHP-Dateien sein sollten.

    :shock: Sorry, ich war mir sicher, den Code durchgesehen zu haben, war aber entweder blind, hab's nicht gemacht, oder beides. :oops: