2015-08-22 3 views
1

Im создайте скрипт для загрузки файла с некоторого файлового сервера, но он не работает отлично.PHP cURL скачать файл браузером

 function downloadPage2($url){ 

     $ch = curl_init(); 
     $userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'; 
     curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_VERBOSE, 1); 
     curl_setopt($ch, CURLOPT_AUTOREFERER, false); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
     curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
     curl_setopt($ch, CURLOPT_HEADER, 1); 
     curl_setopt($ch, CURLOPT_BUFFERSIZE, 8096); 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
     curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $buffer) { 

      header('Expires: 0'); // no cache 
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
      header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT'); 
      header('Cache-Control: private', false); 
      header('Content-Type: application/force-download'); 
      header('Content-Disposition: attachment; filename="mp3.mp3"'); 
      header('Content-Transfer-Encoding: binary'); 
//   header('Content-Length: ' . strlen($buffer)); // provide file size 
      header('Connection: close'); 
      echo $buffer; 
       return strlen($buffer); 
      }); 
     curl_exec ($ch); 
     curl_close($ch); 
    } 

И когда тип $ url в файл (mp3) с сервера, его скачать этот файл, но не правильный размер. Пример: Файл на сервере имеет размер 4,5 МБ, и мой скрипт загрузил его, но размер составляет 6 МБ. Музыка воспроизводится, но прерывается в секунду. Знаете ли вы, где проблема?

Я попытался установить контент-длину в заголовке, но каждый функция возвращает содержимое Lengh = 0

+0

'Вы должны установить все эти варианты, хотя делать ? – mdamia

+0

Я не знаю, я тестировал всю опцию и o dont сейчас, что правильно: D .. coockie требуется – user3633178

+0

см. Обновленный ответ ниже, добавьте опции заголовка, которые вам нужны, что должно дать отправную точку. Все требования к серверу различны, вам просто нужно устранить неполадки, чтобы вы это поняли. – mdamia

ответ

0

Попробуйте это, он работал для меня загружать большие файлы

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $source); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
// if https 
curl_setopt($ch, CURLOPT_SSLVERSION, 3); 
// or set this option 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
$data = curl_exec($ch); 

$error = curl_error($ch); 
$file = $data = curl_exec($ch); 
curl_close($ch); 
if (file_exists($file)) { 
    header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"); 
    header('Content-Disposition: attachment; filename="sometrack.mp3"'); 
    header("Content-Transfer-Encoding: binary"); 
    header('Content-length: ' . filesize($file)); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    readfile($file); 
} else { 
    echo "no file"; 
} 
+0

Но я не хочу загружать файл на диск на свой сервер, но делать его с помощью браузера. Нормальный, как пользователь, нажмите «загрузить» на веб-сайте и получите всплывающее окно с файлом. – user3633178

+0

Извините, любезно подпрыгнула пистолет и дала неправильный ответ на ваш вопрос, обновила мой ответ. – mdamia

+0

Я добавляю setopt с cookie и его работой. Но ... Первый скрипт загружает все байты файлов в кеш, а затем возвращает всплывающее окно для сохранения. Нам не нужно ждать много времени в качестве файла загрузки сервера (скрипта). Скрипт должен передавать файл в реальном времени. – user3633178