2009-10-04 9 views
10

Estoy trabajando en una manera de servir a los archivos MP3 a través de PHP y después de algún tipo de ayuda del SO masiva, lo tengo trabajo hereConfiguración de Apache para servir PHP cuando se solicita un archivo MP3

Sin embargo, ese ejemplo no parece funcionar cuando lo uso como fuente de audio en una etiqueta como esta

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

y aquí está la 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"; 
} 

Así que estoy pensando (y esto puede ser ar una mala idea, dime) que podría configurar Apache para servir un archivo PHP cuando alguien solicita un .MP3.

Así que he tres preguntas

  1. ¿Funcionará
  2. buena idea/mala idea?
  3. ¿Qué debería hacer? ¿Poner "AddType application/x-httpd-php .mp3" int él httpd conf hacerlo?

Respuesta

17

hay algunos errores en su código:

  • Un recurso sólo puede tener un único valor Content-Type. Entonces debe decidir qué tipo de medio quiere usar. Sugiero audio/mpeg.
  • Olvidó especificar la disposición en Content-Disposition. Si solo desea dar un nombre de archivo y no desea cambiar la disposición, use el valor predeterminado inline.

El resto se ve bien. Pero también enviaría el código de estado 404 si no se puede encontrar el archivo.

$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"; 
} 
+0

Genius! Inline hizo el truco y he ordenado el tipo de contenido y ahora estoy enviando un 404. – gargantuan

4

Simplemente puede hacerlo para que tenga una regla mod_rewrite para ejecutar cada solicitud de música/*. Mp3 a través de su archivo mp3.php.

Por ejemplo, algo como esto mp3.php

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

continuación, puede recoger el archivo solicitado de $ _GET [ 'archivo'], pero si vas con este enfoque le recomiendo que la cordura comprobar el nombre del archivo , para garantizar que solo haga referencia a un archivo en el directorio deseado.

//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"); 
} 
+0

que funciona también, pero la otra respuesta era más pura ... supongo. Aunque eso me recordó usar .htaccess para evitar que las personas accedan a los archivos directamente. Aclamaciones. – gargantuan

+0

Esta solución le permite tener URLs .mp3, pero le permite interceptar esas solicitudes con algo de PHP. No es exactamente lo que querías, ¡pero lo comencé, así que terminé! –

+0

Buen esfuerzo. Alguien en algún lugar lo encontrará útil. – gargantuan

0

Esta funciona para mí (en .htaccess):

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