Отправка mp3-файла через PHP для использования со звуковым тегом HTML5 завершается неудачно в середине mp3 - PullRequest
2 голосов
/ 09 марта 2012

Я пытаюсь отправить мои mp3-файлы через PHP-скрипт, чтобы скрыть путь к файлу в HTML. Все отлично работает, за исключением того, что на полпути в mp3 хром дает мне ошибку GET [URL]. А остальные mp3 просто пустые. Аудио тег думает, что он все еще читает файл, но нет звука.

Вот так я отправляю mp3 файл с php:

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. (Это в хроме). Есть идеи, почему это может быть?

1 Ответ

1 голос
/ 01 августа 2017

Я знаю, что это старый пост, но я смог заставить его работать с двумя файлами и 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)); 
    //If this is a secret filename then don't include it.
    header('Content-Disposition: inline');
    //Otherwise you can add it like so, in order to give the download a filename
    //header('Content-Disposition: inline;filename='.$filename);
    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>

есть таблица базы данных с только хешем и используемым полем для этого примера для работы

...