views:

713

answers:

2

In the same way that it's possible to serve up images with php, for use in CAPTACHAS and such, is it possible to do the same with audio files?

I've tried this

<?php

$track = "sometrack.mp3";

if(file_exists($track))
{
header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($track));
header('Content-Disposition: filename="sometrack.mp3"');
header('X-Pad: avoid browser bug');
Header('Cache-Control: no-cache');

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

I'm using Safari, which can play MP3 files. It's kicking Safari into the right mode, I get the Quicktime controls for a few seconds, and then "No Video".

I'm trying to protect files from unauthorized download in case you're wondering why I'd want to do this.

+8  A: 

Your Content-Disposition should be:

header('Content-Disposition: attachment; filename="sometrack.mp3"');

Not sure if that's the problem though. I would also recommend using readfile to output the file:

readfile($rSong);

Also, it can't hurt to use an exhaustive Content-Type header, and set the Content-Transfer-Encoding:

header("Content-Transfer-Encoding: binary"); 
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
karim79
those extra headers made all the difference! Thanks. Although I removed "attachment" for now since I want to play the tracks in the browser, but I'll need to use it later when people download tracks. Great advice, thanks.
gargantaun
+1  A: 

You want to use readfile as file_get_contents returns a string and you are working with binary data.

See http://jp.php.net/file_get_contents and http://jp.php.net/manual/en/function.readfile.php

Try:

<?php

$track = "sometrack.mp3";

if(file_exists($track))
{
    header('Content-type: audio/mpeg');
    header('Content-length: ' . filesize($track));
    header('Content-Disposition: attachment; filename="sometrack.mp3"');
    header('Content-Transfer-Encoding: binary');
    header('X-Pad: avoid browser bug');
    Header('Cache-Control: no-cache');
    ob_clean();
    flush();    
    readfile($track);
}
?>
Jonathan Fingland