Google Chrome schließt die Anforderung nicht ab, wenn ein Teilinhaltsheader festgelegt ist

Ich versuche, eine MP3-Datei mit dem HTTP / 1.1-Header "Partial Content" an SoundManager zu streamen, um einen gewissen Schutz für meine Mediendateien zu gewährleisten und Benutzern das Suchen an verschiedenen Stellen des Titels zu ermöglichen. Der Code, den ich habe, funktioniert in IE7-10, Firefox, Safari und Opera, aber er funktioniert nicht in Google Chrome. Wenn ich den Teilinhalt-Header entfernen würde, würde er die Datei wiedergeben, dem Benutzer jedoch nicht erlauben, danach zu suchen.

Wenn Sie die Registerkarte "Netzwerk" in den Chrome-Entwicklungstools überprüfen, gibt es zwei Anfragen, von denen eine den Status "Ausstehend" und die andere den Status "Abgebrochen" aufweist. Beide Anforderungen haben eine Größe von 13B. Die Datei, die ich abzuspielen versuche, ist 9,11 MB groß.

Unten ist der Code, mit dem ich die Header setze und die Datei lese.

        $name = $_GET['name'];
        $file_size = filesize($file);
        $file = "C:\xampp\htdocs\..\protected\music\testsong.mp3"; // song, user and all other checks are performed before this to get the file path.
        $etag = md5(uniqid(rand(), true));

        $open_file = fopen($file, 'rb');
        if( !$open_file ) throw new Exception('Could not open file');

        $start = 0;
        $end = $file_size - 1;

        if( isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE']) ) {
            $range = explode('-', substr($_SERVER['HTTP_RANGE'], strlen('bytes=')));

            $start = $range[0];
            if( $range[1] > 0 ) $end = $range[1];

            header('HTTP/1.1 206 Partial Content');
            header('Status: 206');
            header('Accept-Ranges: bytes');
            header('Content-Range: ' . $_SERVER['HTTP_RANGE'] . '/' . $file_size);
            header('Content-Length: ' . ($end - $start + 1));
        } else header('Content-Length: ' . $file_size);

        header('Content-Type: ' . $content_type);
        if( $download ) header('Content-Disposition: attachment; filename="' . $name . '"');
        header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T', filemtime($file)));

        header('ETag: "' . $etag . '"');
        header('Expires: 0');
        header('Pragma: no-cache');
        header('Cache-Control: must-revalidate');

        if( $start > 0 ) fseek($open_file, $start);

        $bytes_position = $start;
        while( !feof($open_file) && $bytes_position <= $end ) {
            if( connection_aborted() || connection_status() != 0 ) throw New Exception('Connection Aborted');

            $chunk = 1048000;
            if( $bytes_position + $chunk > $end + 1 ) $chunk = $end - $bytes_position + 1;

            $chunk = fread($open_file, $chunk);
            if( !$chunk ) throw New Exception('Could not read file');

            print($chunk);
            flush();

            $bytes_position += $chunk;
        }

        fclose($open_file);

Antworten auf die Frage(1)

Ihre Antwort auf die Frage