12

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.

karim79
  • 339,989
  • 67
  • 413
  • 406
gargantuan
  • 8,888
  • 16
  • 67
  • 108
  • You should be able to - not sure why that doesn't work, but you are on the right lines. Try wget/curl from the command line on the url you access the file from and check that it's working as expected. – Rich Bradshaw Oct 04 '09 at 15:29

3 Answers3

16

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
  • 339,989
  • 67
  • 413
  • 406
  • 1
    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. – gargantuan Oct 04 '09 at 15:44
  • Note that `XSendfile` (on Apacha and nginx otoh) can seriously reduce the load on the server / php, and still use documents outside the document root. – Wrikken Jan 26 '12 at 22:41
1

try using This Class it supports download resume and speed limit believe me u need it as an owner of mp3 downloads website

Rami Dabain
  • 4,709
  • 12
  • 62
  • 106
1

Per the discussion here, plus readfile() from the PHP site for PHP 4, 5, 7 & 8, I came up with this:

if (file_exists($file)) {
  header('Content-Description: File Transfer');
  header("Content-Transfer-Encoding: binary");
  header('Content-Type: audio/mpeg');
  header('Content-Disposition: attachment; filename="'.basename($file).'"');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: '.filesize($file));
  readfile($file);
  exit;
}
Jesse
  • 750
  • 1
  • 9
  • 25