tag - Configuración de Apache para servir PHP cuando se solicita un archivo MP3
html5 audio autoplay (4)
Estoy trabajando en una forma de servir archivos MP3 a través de PHP y después de un poco de ayuda formé el SO masivo, lo conseguí trabajando aquí
Sin embargo, ese ejemplo no parece funcionar cuando lo uso como fuente en una etiqueta de audio 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á el 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 esta puede ser una muy mala idea, me dices) que podría configurar Apache para servir un archivo PHP cuando alguien solicita un .MP3.
Entonces tengo tres preguntas
- Esto funcionara
- Buena idea / mala idea?
- ¿Qué debería hacer? ¿Poner "AddType application / x-httpd-php .mp3" int él httpd conf hacerlo?
Hay algunos errores en tu código:
- Un recurso solo puede tener un único valor de tipo de contenido . 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 en
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";
}
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
RewriteEngine on
RewriteRule ^/music/(.*/.mp3) /music/mp3.php?file=$1 [L]
mp3.php puede recoger el archivo solicitado desde $ _GET [''file''], pero si usa este enfoque, le recomiendo que revise el nombre del archivo, para asegurarse de 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");
}
Utilice el encabezado x-sendfile en lugar de readfile para una mejor ejecución.
http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/
Este funciona para mí (en .htaccess):
<FilesMatch "mp3$">
SetHandler application/x-httpd-php5
</FilesMatch>