Configurar o Apache para servir PHP quando um arquivo MP3 é solicitada

votos
10

Eu estou trabalhando em uma maneira de servir arquivos MP3 através do PHP e depois de algum ajudar a formar a tão grande, eu tenho que trabalhar aqui

No entanto, esse exemplo não aparecer para trabalhar quando eu usá-lo como fonte em uma tag de áudio como este

<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>

e aqui está o 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;
}

Então, eu estou pensando (e isso pode ser uma péssima idéia, você me dizer) que eu poderia ser capaz de configurar o Apache para servir um arquivo PHP quando alguém solicita uma .MP3.

Então, eu tenho três perguntas

  1. Isso vai funcionar
  2. Good Idea / Bad Idea?
  3. O que eu preciso fazer? Iria colocar AddType application / x-httpd-php .mp3 int ele httpd conf fazê-lo?
Publicado 04/10/2009 em 17:20
fonte usuário
Em outras línguas...                            


4 respostas

votos
17

Há alguns erros em seu código:

  • Um recurso só pode ter um único Content-Type valor. Então você tem que decidir que tipo de mídia que você deseja usar. Eu sugiro audio/mpeg.
  • Você esqueceu de especificar a disposição em Content-Disposition . Se você só quer dar um nome de arquivo e não quer mudar a disposição, use o valor padrão inline.

O resto parece bem. Mas também gostaria de enviar o código de status 404 se o arquivo não pode ser encontrado.

$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";
}
Respondeu 04/10/2009 em 17:31
fonte usuário

votos
4

Você poderia simplesmente fazer com que você tem uma regra mod_rewrite para executar todos os pedidos para a música / *. Mp3 através de seu arquivo mp3.php.

Por exemplo, algo como isto

RewriteEngine on
RewriteRule ^/music/(.*\.mp3)    /music/mp3.php?file=$1 [L]

mp3.php pode então pegar o arquivo a partir de $ _GET [ 'file'], mas se você vai com esta abordagem que eu recomendo que você sanidade verificar o nome do arquivo, para garantir que só faz referência a um arquivo no diretório desejado.

//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");
}
Respondeu 04/10/2009 em 17:30
fonte usuário

votos
2

Use o cabeçalho x-sendfile vez de readfile por melhores performanse.

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

Respondeu 04/10/2009 em 20:15
fonte usuário

votos
0

Este funciona para mim (em .htaccess):

<FilesMatch "mp3$">
    SetHandler application/x-httpd-php5
</FilesMatch>
Respondeu 06/10/2009 em 01:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more