Вот так выглядит у меня файл выдачи мп3-файла (mp3.php):
if(isset($_GET['file'])) {$file = $_GET['file'];} else {$file = '';}
if (preg_match('|^[a-z0-9_\.\-\/]+$|i', $file)){
$ext = strtolower(substr($file, strrpos($file, '.') + 1));
if($ext == 'mp3'){
$filename = 'папка/подпапка/' . $file;
$filename = file_get_contents($filename);
header('Content-Disposition: inline; filename="' . $file . '"');
header('Content-type: audio/mpeg');
header('Content-Length: ' . strlen($filename));
echo $filename;
}
}
exit;
Ссылка на скачивание имеет 2 переменные (ид файла в базе и сгенерированный код из сессии).
Путь к загрузке лежит через простенький скрипт, где у меня идет проверка сгенерированного кода на совпадение с сессией, существование файла и запись количества скачиваний (+1).
То есть если все гут, я пишу +1 скачивание и отдаю файл:
header ('Location: mp3.php?file=имя_файла.mp3); exit;