В PHP потоковое MP3

У меня очень похожая ситуация с человеком, который спросил: могу ли я обслуживать MP3-файлы с PHP? В основном я пытаюсь защитить mp3-файлы от прямой загрузки,поэтому пользователи должны пройти php, чтобы пройти проверку подлинности. Вот мой код:

header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($file));
header('X-Pad: avoid browser bug');
Header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
readfile($file);

вот моя проблема: файл воспроизводит только очень маленький кусок начала (через Quicktime в браузере), а затем останавливается - Quicktime, кажется, думает длина файла только до тех пор, как часть его удалось скачать. Когда я перезагружаю - он играет немного больший кусок-все, что ему удалось загрузить до этого момента.

это проблема в заголовках, которые я отправляю? Как бы я передал такой файл? Это проблема, если swf читает из этого файла?

спасибо!


спасибо Вам за все ответы. Хотя ни одна из этих вещей не была именно тем, что решило проблему, многие из них отправили меня в правильном направлении. Много оцененный. Для полного решения см. Мой ответ ниже

7 ответов


вот что сделало трюк.

$dir = dirname($_SERVER['DOCUMENT_ROOT'])."/protected_content";
$filename = $_GET['file'];
$file = $dir."/".$filename;

$extension = "mp3";
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3";

if(file_exists($file)){
    header('Content-type: {$mime_type}');
    header('Content-length: ' . filesize($file));
    header('Content-Disposition: filename="' . $filename);
    header('X-Pad: avoid browser bug');
    header('Cache-Control: no-cache');
    readfile($file);
}else{
    header("HTTP/1.0 404 Not Found");
}

Если ваш сервер работает на apache или lighty, я бы предложил вам заглянуть в x-sendfile

http://tn123.ath.cx/mod_xsendfile/

Это позволяет обрабатывать аутентификацию в вашем приложении php, но давайте ваш веб-сервер обрабатывать передачу файла. улучшение производительности, которое вы получаете, должно быть приятным дополнительным преимуществом


вы можете попробовать HTTP в фрагментации. Установите заголовок" Transfer-Encoding "в" chunked", затем выведите размер каждого фрагмента перед его отправкой. Конец каждого размера куска и кусок с CRLF.

для чего-либо более сложного я рекомендую использовать потоковый сервер, например для icecast.


две вещи выделяются:

  1. у вас Content-Length set. Если сервер настроен на автоматический gzip вывода, это может испортить вещи. Попробуйте выключить Content-Length и посмотреть, исправит ли это.
  2. у вас около тысячи Content-Types набор. Поскольку это Mp3, который вы обслуживаете, просто используйте audio/mpeg. Вы можете эффективно избавиться от последнего . Легко увлечься HTTP-заголовками.

попробуйте и дайте нам знать как все идет!


удалить header("Content-Transfer-Encoding: binary"); и вы будете устанавливать!


для этого решения вам также нужно настроить xsendfile в apache (mod_xsendfile) или Nginx HttpSecureLinkModule - они дадут вам точный mp3, поэтому браузер будет играть правильно


применение всех этих решений, которые действительны, чтобы скрыть исходный путь и имя файла, к сожалению, не предотвращает несанкционированную загрузку. Действительно, клиент (в моем случае: Chrome) загружает файл.

вот строки, которые я поставил на своем сервере:

<?php
$dir = dirname($_SERVER['DOCUMENT_ROOT'])."/mp3";
$filename = $_GET['file'];
$file = $dir."/".$filename;

$extension = "mp3";
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3";

if(file_exists($file)){
    header('Content-type: {$mime_type}');
    header('Content-length: ' . filesize($file));
    header("Content-Transfer-Encoding: binary"); 
    header('Content-Disposition: filename="' . $filename);
    header('X-Pad: avoid browser bug');
    header('Cache-Control: no-cache');
    readfile($file);
}else{
    header("HTTP/1.0 404 Not Found");
}
?>

С или без строки

    header("Content-Transfer-Encoding: binary"); 

конечный результат не меняется Каталог / mp3 находится в

/home/myuser/

(таким образом / главная / myuser / mp3) и общедоступный каталог HTML is

/home/myuser/public_html

таким образом, называя мой домен и давая

/player.php?file=music.mp3

он загружает файл под названием Музыка.mp3 со всем оригинальным контентом.