在请求MP3文件时设置apache以提供PHP

时间:2009-10-04 16:20:07

标签: php audio html5 mp3

我正在研究一种通过PHP提供MP3文件的方法,并且在形成了大量的帮助后,我开始工作here

然而,当我将它用作像这样的音频标签中的源时,该示例似乎不起作用

<html>
    <head>
        <title>Audio Tag Experiment</title>
    </head>
    <body>

    <audio id='audio-element' src="music/mp3.php" autoplay controls>
    Your browser does not support the audio element.
    </audio>

    </body>
</html>

这是PHP

<?php

$track = "lilly.mp3";

if(file_exists($track))
{
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
header('Content-length: ' . filesize($track));
header('Content-Disposition: filename="lilly.mp3"');
header('X-Pad: avoid browser bug');
Header('Cache-Control: no-cache');

readfile($track);
}else{
    echo "no file";
}

所以我在思考(这可能是一个非常糟糕的主意,你告诉我)当有人请求.MP3时,我可以设置Apache来提供PHP文件。

所以我有三个问题

  1. 这会有效吗
  2. 好主意/坏主意?
  3. 我需要做什么?将“AddType application / x-httpd-php .mp3”放入httpd conf中吗?

4 个答案:

答案 0 :(得分:17)

您的代码中存在一些错误:

  • 资源只能有一个Content-Type值。因此,您必须决定要使用的媒体类型。我建议audio/mpeg
  • 您忘了在Content-Disposition中指定处理方式。如果您只想提供文件名而不想更改处置方式,请使用默认值inline

其余的看起来很好。但如果找不到该文件,我也会发送404状态代码。

$track = "lilly.mp3";

if (file_exists($track)) {
    header("Content-Type: audio/mpeg");
    header('Content-Length: ' . filesize($track));
    header('Content-Disposition: inline; filename="lilly.mp3"');
    header('X-Pad: avoid browser bug');
    header('Cache-Control: no-cache');
    readfile($track);
    exit;
} else {
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
    echo "no file";
}

答案 1 :(得分:4)

您可以简单地设置它,以便您有一个mod_rewrite规则来通过您的mp3.php文件运行音乐/ * .mp3的每个请求。

例如,像这样

RewriteEngine on
RewriteRule ^/music/(.*\.mp3)    /music/mp3.php?file=$1 [L]
然后,mp3.php可以从$ _GET ['file']中获取所请求的文件,但如果您采用这种方法,我建议您检查文件名,以确保它只引用所需目录中的文件。 / p>
//ensure filename just uses alphanumerics and underscore
if (preg_match('/^[a-z0-9_]+\.mp3$/i', $_GET['file']))
{
    //check file exists and serve it

    $track=$_SERVER['DOCUMENT_ROOT'].'/music/'.$_GET['file'];
    if(file_exists($track))
    {
        header("Content-Type: audio/mpeg");
        header('Content-length: ' . filesize($track));
        //insert any other required headers...

        //send data
        readfile($track);
    }
    else
    {
        //filename OK, but just not here
        header("HTTP/1.0 404 Not Found");
    }

}
else
{
    //bad request
    header("HTTP/1.0 400 Forbidden");
}

答案 2 :(得分:2)

使用标头x-sendfile而不是readfile来获得更好的性能。

http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/

答案 3 :(得分:0)

这个适用于我(在.htaccess中):

<FilesMatch "mp3$">
    SetHandler application/x-httpd-php5
</FilesMatch>