通过PHP发送mp3文件以与HTML5的音频标签一起使用在mp3中间失败

时间:2012-03-09 01:23:14

标签: php mp3 html5-audio

我正在尝试通过PHP脚本发送我的mp3文件,以隐藏HTML中文件的路径。一切都运行得很好,除了进入mp3 chrome的一半给我一个GET [URL]错误。而其余的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文件的标头不同。实际上有一个HTTP_RANGE请求被发送到mp3文件,但当我尝试从PHP获取东西时,这个范围请求丢失了。 (这是在Chrome中)。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

我知道这是一个旧帖子,但我能够使用两个文件和index.php和example.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");
  }

这里是带有音频标签的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>

有一个数据库表,其中只有一个哈希值和一个用于此示例的字段