2009-10-04 10 views
10

Je travaille sur un moyen de servir des fichiers MP3 par PHP et après une certaine forme d'aide la si massive, je l'ai eu à travailler hereConfigurer apache pour servir PHP lorsqu'un fichier MP3 est demandé

Cependant, ce exemple ne semble pas fonctionner quand je l'utilise comme source dans une balise audio comme celui-ci

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

et voici le 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"; 
} 

Je pense (et cela peut être ar vraiment une mauvaise idée, vous me dites) que je pourrais être en mesure de configurer Apache pour servir un fichier PHP quand quelqu'un demande un .MP3.

J'ai trois questions

  1. Est-ce que ce travail
  2. bonne idée/mauvaise idée?
  3. Que devrais-je faire? Est-ce que mettre "application AddType/x-httpd-php .mp3" int httpd conf le faire?

Répondre

17

Il y a quelques erreurs dans votre code:

  • Une ressource ne peut avoir qu'une seule valeur Content-Type. Vous devez donc décider quel type de média vous voulez utiliser. Je suggère audio/mpeg.
  • Vous avez oublié de spécifier la disposition dans Content-Disposition. Si vous voulez juste donner un nom de fichier et ne voulez pas changer la disposition, utilisez la valeur par défaut inline.

Le reste semble bien. Mais je voudrais également envoyer le code d'état 404 si le fichier ne peut pas être trouvé.

$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

Génie! Inline a fait le tour et j'ai rangé le Content-Type et j'envoie maintenant un 404. – gargantuan

4

Vous pouvez simplement faire en sorte que vous ayez une règle mod_rewrite pour exécuter chaque requête de musique/*. Mp3 via votre fichier mp3.php.

Par exemple, quelque chose comme ça

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

mp3.php peut alors récupérer le fichier demandé à partir de $ _GET [ « fichier »], mais si vous allez avec cette approche, je vous recommande de vérifier le nom du fichier Sanity , pour s'assurer qu'il ne fait référence qu'à un fichier dans le répertoire désiré.

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

Cela fonctionne aussi, mais d'autre réponse était ... plus purs je suppose. Bien que cela m'a rappelé d'utiliser .htaccess pour empêcher les gens d'accéder directement aux fichiers. À votre santé. – gargantuan

+0

Cette solution vous permet d'avoir des URL .mp3, mais vous permet d'intercepter ces requêtes avec du PHP. Ce n'est pas tout à fait ce que tu voulais, mais je l'ai commencé alors j'ai fini! –

+0

Bon effort. Quelqu'un quelque part trouvera cela utile. – gargantuan

0

Celui-ci travaille pour moi (en .htaccess):

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