header() Umleitung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • header() Umleitung

    Folgendes Problem:

    Ich habe ein Script geschrieben, welches es ermöglichen soll, Dateien runterzuladen. Der Name der Datei wird aus einer Datenbank gelesen und mittels header("Location: $file"); übergeben.

    Auch alle anderen header Anweisungen in anderen Dateien funktionieren nicht. Wer möchte kann ja mal reinschauen. Psykonaut Records (Seite befindet sich noch in der Entwicklung)

    Im Manual und in diversen Büchern steht, dass die Anweisung header() generell immer am Anfang einer Datei (vor dem HTML Code) stehen muss. Die header('Location: ') Anweisung wäre aber eine Ausname. Es ist eben nur eine Weiterleitung.

    Hier das Codebeispiel:

    PHP-Code:
    ...
    <td>
        Filesize: {$row['file']} bytes<br />
        Downloads: {$row['clicks']}<br />
        Average Rating: {$row['rating']} [votes: {$row['rate_count']}]<br /><br />
        [ <a href=\"./tracks_download.php?id={$row['id']}\">Download this track</a> ]<br />
        <br />
    </td>
    .
    .
    .
    <?php
    if (isset($_GET['id'])) {
        
    $result mysql_query("SELECT file FROM tracks WHERE id = '".$_GET['id']."'");
        
    $file mysql_result($result0'file');
        
    mysql_query("UPDATE tracks SET clicks = clicks + 1 WHERE id = '".$_GET['id']."'");
        
        
    header("location: $file");
        exit();
    }
    Der Code befindet sich in der selben Datei. Es wird also keine Template Klasse verwendet. Wie kann ich es trotz HTML verwirklichen, dass der header Befehl arbeitet und somit der Download funktioniert?
    MM Newmedia | MeinBlog

  • #2
    Re: header() Umleitung

    Original geschrieben von ezkimo
    Im Manual und in diversen Büchern steht, dass die Anweisung header() generell immer am Anfang einer Datei (vor dem HTML Code) stehen muss. Die header('Location: ') Anweisung wäre aber eine Ausname. Es ist eben nur eine Weiterleitung.
    Ich welcher Übersetzung steht das denn ... Suaheli ... weder im Deutschen noch im Englischen Manual ist so eine Aussage zu finden ... !

    Die dort erwähnte Ausnahme bezieht sich lediglich auf den Umstand, dass, so ein Location-Header gesendet wird automatisch ein Statuscode 302 Verwendung findet ... !
    carpe noctem

    [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
    [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

    Kommentar


    • #3
      Die header Funktion muss definitiv vor irgend einer Ausgabe erfolgen! Desshalb funktioniert es bei dir nicht!

      Du hast entweder die Möglichkeit mittels eines "meta refresh" eine Weiterleitung nach einer bestimmten Zeit zu bewirken, oder alle Ausgaben vor dem header() entfernen!

      Kommentar


      • #4
        oder er führt am Anfang des Scripts ein ob_start() aus ... !
        carpe noctem

        [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
        [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

        Kommentar


        • #5
          Re: header() Umleitung

          Original geschrieben von ezkimo
          Im Manual und in diversen Büchern steht, dass die Anweisung header() generell immer am Anfang einer Datei (vor dem HTML Code) stehen muss. Die header('Location: ') Anweisung wäre aber eine Ausname.
          absoluter unfug.
          wo bitte soll derartiger nonsense stehen?

          auch vor einem location-header dürfen keinerlei ausgaben erfolgt sein.
          und er erfordert die angabe eines kompletten URLs inklusive http://...
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            und er erfordert die angabe eines kompletten URLs inklusive http://...
            Ist so natürlich absolut richtig, trotzdem akzeptiert der größte Teil der Browser relative Angaben.

            Schöner wär's aber wenn das nicht so wär, junge, da wär was los hier im Forum
            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
            Schön - etwas Geschichte kann ja nicht schaden.
            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

            Kommentar


            • #7
              Okay ... dann habe ich wohl was falsch verstanden. Danke für die Aufklärung.

              Werde mich weiter durch's Manual schlagen und die erwähnten Befehle anwenden. Ddanke ncohmal für die Hilfe.

              Achso nochwas: Kann mir jemand erklären, wieso die header Befehler lokal (XAMPP) funktionieren?
              MM Newmedia | MeinBlog

              Kommentar


              • #8
                Hab irgendwie den Verdacht, dass die da eh auch nicht funktionieren, aber vielleicht sind bei XAMPP die Error_level so 'weich' eingestellt, das quasi alles erlaubt ist, was eigentlich verboten sein sollte.
                Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                Schön - etwas Geschichte kann ja nicht schaden.
                Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                Kommentar


                • #9
                  Goth hat es doch schon erwähnt:
                  wenn man die ausgabe zuerst puffert, dann kann man im ganzen script "headern" nach lust und laune.
                  (ist aber idR. nicht empfehlenswert, und insb. nicht für anfänger, die sich dann noch weniger gezwungen sehen, auf eine halbwegs ordentliche struktur ihrer scripte zu achten ...)
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    So Homies ... da bin ich wieder. Nachdem ich das Problem mit den Headern erfolgreich umgangen habe, und nun eine sehr schöne Template Engine benutze, habe ich immernoch Probleme mit dem header.

                    Folgendes soll passieren:

                    Ich biete MP3 Files (meine eigenen) zum Download an. Per Click auf einen Link, soll mittels header der Download des Files erzwungen werden. Easy, oder?

                    Folgender Code ist vorhanden:

                    PHP-Code:
                    // Track downloaden
                    if (isset($_GET['id'])) {
                        
                    $result $db->query("SELECT * FROM tracks WHERE id = '".$_GET['id']."'");
                        while (
                    mysql_fetch_array($result)) {
                            
                            
                    $db->query("UPDATE tracks SET clicks = clicks + 1 WHERE id = '".$row['id']."'");
                            
                            
                    $file $row['file'];
                            
                                    
                    header("Content-Disposition: attachment; filename=".$row['file']);
                            
                    header("Content-Type: application/force-download");
                            exit;
                            }

                    Was passiert?
                    Nüscht! Zumindest nicht das, was eigentlich gewollt ist. Nämlich der Download des MP3 Files. Stattdessen kann man aber die php Datei runterladen.

                    Wo könnte das Problem liegen?
                    In der Variablen $row['file'] ist nicht nur der Dateiname, sondern auch der Pfad zur Datei gespeichert. (Beispiel: ../tracks/file.mp3)

                    Was kann ich tun?
                    MM Newmedia | MeinBlog

                    Kommentar


                    • #11
                      Original geschrieben von ezkimo
                      In der Variablen $row['file'] ist nicht nur der Dateiname, sondern auch der Pfad zur Datei gespeichert. (Beispiel: ../tracks/file.mp3)

                      Was kann ich tun?
                      das ändern ...?

                      (bzw. kürzen, so dass du nur einen filenamen im header angibst.)
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        So ich habe dann jetzt auch mal wieder Zeit für mein kleines privates Projekt gefunden und das Problem nach ganz einfachem Trial and Error auf einfachste Art und Weise gelöst ... zumindest vorübergehend, da ich schon wieder das nächste Problem sehe.

                        Lösung des oben genannten Problems:

                        PHP-Code:
                         // Track downloaden
                        if (isset($_GET['id'])) {
                            
                        $result $db->query("SELECT * FROM tracks WHERE id = '".$_GET['id']."'");
                            while (
                        mysql_fetch_array($result)) {
                                
                                
                        $db->query("UPDATE tracks SET clicks = clicks + 1 WHERE id = '".$row['id']."'");
                                
                                
                        $file $row['file'];
                                
                                
                        header("Location: $file");
                                }

                        Es wird einfach nur der Inhalt von $file (./tracks/filename.mp3) übergeben ohne das Script durch exit() zu beenden. Kaum zu glauben ... aber es funktionert. Allerdings wird hier nicht zwingend ein Download ausgeführt. Bei manchen Browsern wird die Datei abgespielt, bei anderen widerum runtergeladen. Gibt es eine Möglichkeit einen Download zu "erzwingen"?
                        MM Newmedia | MeinBlog

                        Kommentar


                        • #13
                          Auf http://php.net/header findest du einige Beispiele. Such dort mal nach Content-Disposition.

                          Btw: Erzwingen kannst du gar nichts, weil ich als User mein System einrichten kann wie ich möchte. Wenn mein Browser das zuläßt, kann ich alles was mit http anfängt und auf mp3 endet sofort meinem Lieblingsplayer übergeben.

                          Kommentar

                          Lädt...
                          X