2012-03-09 7 views
2

HTMLファイルのパスを隠すために、PHPスクリプトを使用してmp3ファイルを送信しようとしています。 mp3クロムの半分を除いて、すべてが完璧にうまくいっています。私はGET [URL]エラーを返します。 mp3の残りの部分は空白です。オーディオタグはまだファイルを読み込んでいると思っていますが、サウンドはありません。HTML5のオーディオタグで使用するPHP経由のMP3ファイルをmp3の途中で送信できない

これは、私はPHPからmp3ファイルを送信しています方法です:

if (file_exists($filename)) { 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Type: audio/mpeg"); 
    header('Content-length: ' . filesize($filename)); 
    header('Content-Disposition: inline; filename="' . $filename . '"'); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 


    readfile($filename); 
    exit; 
} 
else { 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    echo "no file"; 
} 

編集:私はのEtagヘッダを追加しました。物事を良くするようです。問題はまだ発生しますが、頻繁には発生しません。 :/

Edit2:PHPファイルに送信されたリクエストヘッダーが、mp3ファイルに直接送信されたヘッダーと異なることに気付きました。実際には、mp3ファイルにHTTP_RANGEリクエストが送信されていますが、PHPからファイルを取得しようとすると、この範囲リクエストがありません。 (これはChromeにあります)。なぜこれが起こっているのでしょうか?

+1

あなたのスクリプトを動作させるだけのハッシュと、この例で使用されたフィールドを持つデータベースのテーブルがあり、範囲を要求する可能性があるクロームでHTML 5タグ。スクリプトのサポート範囲を作ったり、小さなファイルで試してみてください。 「PHPのHTTP_RANGEヘッダーの解析」(http://stackoverflow.com/questions/2209204/parsing-http-range-header-in-php)も参照してください。 – hakre

+0

私のファイルはあまり大きくありません。平均サイズは10MB未満です。最大の容量は30MBです。デフォルトのコンテンツ範囲は何ですか? 50 MBのようなものに設定できますか? – Roozbeh15

+0

@hakre、これは答えになるはずです。 – davidethell

答えて

0

これは古い投稿ですが、これは2つのファイルとindex.phpとexample.phpで動作するようになりました。

これは、ファイルが

<?php 

    if(isset($_GET['hash'])){ 
    $mysqli = new mysqli('host_here','user_here','password_here','database_here'); 
    $result = $mysqli->query("select * from hashes where hash = '{$_GET['hash']}' limit 1"); 

    $row = $result->fetch_array(); 
    } 

    if(isset($row['used']) && $row['used'] == 0){ 
    $mysqli->query("update hashes set used=1 where hash = '{$_GET['hash']}'"); 
    $filename = "example.mp3"; 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Type: audio/mpeg"); 
    header('Content-length: ' . filesize($filename)); 
    header('Content-Disposition: inline; filename="' . $filename . '"'); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 


    readfile($filename); 
    exit; 
    } 

    elseif(isset($row['used']) && $row['used'] == 1){ 
    die("you can't just download this dude"); 
    } 

前に使用されているかどうかを知るために、ハッシュのためのdatabseと使用するフィールドをチェックしていますexample.phpあり、ここで演奏できるようになりますオーディオタグとはindex.phpでありますmp3のダウンロードはできません。

<html> 
<body> 
<?php 

    $mysqli = new mysqli('localhost','root','','test_mp3'); 
    $rand = mt_rand(); 
    $hash = md5($rand); 
    $result = $mysqli->query("insert into hashes (hash,used) values('$hash',0)"); 

?> 
    <audio controls> 
    <source src="example.php?hash=<?=$hash?>" type="audio/mpeg"> 
    </audio> 
</body> 
</html> 

範囲をサポートしていません

関連する問題