2009-10-04 20 views
10

pracuję na sposób służyć do plików MP3 poprzez PHP i po jakiejś formy pomocy SO masywny, mam to działa hereKonfiguracja apache służyć PHP, gdy plik MP3 jest proszony

jednak, że przykład nie wydaje się działać, gdy używam go jako źródło w tagu audio, jak to

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

i oto 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"; 
} 

Więc myślę (a to może być ar ten zły pomysł, powiedz mi), że być może uda mi się skonfigurować Apache do obsługi pliku PHP, gdy ktoś zażąda .MP3.

Więc mam trzy pytania

  1. Czy ta praca
  2. dobry pomysł/Bad pomysł?
  3. Co powinienem zrobić? Czy wstawiłabym "AddType application/x-httpd-php .mp3" na httpd conf?

Odpowiedz

17

Istnieją pewne błędy w kodzie:

  • Zasób może mieć tylko jedną pojedynczą wartość Content-Type. Musisz zdecydować, jakiego typu mediów chcesz użyć. Sugeruję audio/mpeg.
  • Nie pamiętasz podać dyspozycji w Content-Disposition. Jeśli chcesz podać nazwę pliku i nie chcesz zmieniać dyspozycji, użyj wartości domyślnej inline.

Reszta wygląda dobrze. Ale wysłałbym też kod statusu 404, jeśli nie można znaleźć pliku.

$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

Geniusz! Inline wykonał sztuczkę i uporządkowałem Content-Type, a teraz wysyłam 404. – gargantuan

4

Można po prostu zrobić tak, aby mieć regułę mod_rewrite do uruchamiania każdego żądania muzyki/*. Mp3 za pośrednictwem pliku mp3.php.

Na przykład coś takiego

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

mp3.php można następnie odebrać żądany plik z $ _GET [ „plik”], ale jeśli się z tym podejściem polecam Sanity sprawdzić nazwę pliku , aby upewnić się, że odnosi się tylko do pliku w pożądanym katalogu.

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

który działa zbyt, ale druga odpowiedź była czystsza ... Chyba. Chociaż to przypomniało mi użycie .htaccess, aby uniemożliwić dostęp do plików bezpośrednio. Twoje zdrowie. – gargantuan

+0

To rozwiązanie pozwala mieć .mp3 adresy URL, ale pozwala na przechwytywanie tych żądań za pomocą jakiegoś PHP. Nie było to dokładnie to, czego chciałeś, ale zacząłem, więc skończyłem! –

+0

Dobry wysiłek. Ktoś gdzieś tam uzna to za przydatne. – gargantuan

0

Ten działa dla mnie (w .htaccess):

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