Bir MP3 dosyası istendiğinde PHP hizmet etmek için apache kurma

4 Cevap php

Ben PHP ile ve bazı yardım formdan sonra MP3 dosyalarını sunmak için bir yol üzerinde çalışıyorum SO masif, ben o çalışma var here

Ben böyle bir ses etiketi kaynağı olarak kullanmak Ancak, bu örnek çalışması için görünmüyor

<html>
    <head>
    	<title>Audio Tag Experiment</title>
    </head>
    <body>

    <audio kimlik='audio-element' src="music/mp3.php" autoplay controls>
    Your browser does not support the audio element.
    </audio>

    </body>
</html>

ve burada PHP bulunuyor

<?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: avokimlik browser bug');
Header('Cache-Control: no-cache');

readfile($track);
}else{
    echo "no file";
}

Yani Düşünüyorum birisinin. MP3 istediğinde bir PHP dosyası hizmet etmek için Apache kurmak mümkün olabilir (ve bu gerçekten kötü bir fikir olabilir, sen söyle).

Yani üç soru var

  1. Olacak bu iş
  2. İyi Fikir / kötü bir fikir?
  3. Ben ne yapmam gerekir? O conf httpd int it "AddType application / x-httpd-php. Mp3" mi koyarak misiniz?

4 Cevap

Kodunuzda bazı hatalar vardır:

  • Bir kaynak, sadece olabilir tek Content-Type value. So you have to decide what media type you want to use. I suggest audio/mpeg.
  • Sen Content-Disposition . If you just want give a filename and don’t want to change the disposition, use the default value inline olarak eğilim belirtmeyi unuttum.

Gerisi gayet iyi görünüyor. Dosya bulunamadı olamaz ama eğer ben de 404 durum kodunu göndermek istiyorsunuz.

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

Eğer mp3.php dosyası üzerinden müzik / *. Mp3 için her isteği çalıştırmak için mod_rewrite kuralı var ki sadece bunu yapmak olabilir.

Örneğin, bir şey böyle

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

mp3.php sonra $ _GET ['dosya'] dan istenen dosyayı alabilirsiniz, ancak bu yaklaşım ile giderseniz ben sadece istenen dizinde bir dosya başvuran sağlamak için, size dosya adını kontrol aklı öneririz.

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

Daha iyi performanse için yerine readfile başlık x-sendfile kullanın.

http://john.guen.in/past/2007/4/17/send%5Ffiles%5Ffaster%5Fwith%5Fxsendfile/

Bu bir (. Htaccess) benim için çalışıyor:

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