//а чтобы файл нормально сохранялся, а не с адресом скрипта,
//надо настроить mod_rewrite, чтобы на запрос блаблабла/file.mp3 выдавался этот скрипт
<?php
//урл удаленного файла
$url = 'http://snippets.pp.ru/1.mp3';
//инициализация сеанса curl
$ch = curl_init($url);
//если клиент запрашивает докачку
if(isset($_SERVER['HTTP_RANGE'])) {
curl_setopt($ch, CURLOPT_RANGE, str_replace('bytes=', '', $_SERVER['HTTP_RANGE']));
}
//бинарные данные
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
//функция обратного вызова для заголовков (выдает такие же заголовки как и удаленный сервер)
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'curlHeaderCallback');
//падаем в случаи ошибки
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
//браузер
curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 5.1; U; ss; MRA 5.4 (build 02647); ru) Presto/2.2.15 Version/10.00');
//accept браузера
$info = array(
'Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1',
'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8',
'Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $info);
//запуск
curl_exec($ch);
function curlHeaderCallback($ch, $strHeader) {
//выдаем такой же заголовок, как и удаленный сервер, где лежит файл.
//заголовки идут по порядку
header($strHeader);
return strlen($strHeader);
}