2011-02-10 3 views
4

Я хочу загрузить удаленный файл с curl и вывести его мгновенно пользователю. Пользователь должен подумать, что он загружает файл с моего сервера вместо удаленного сервера. Я не могу буферизировать все файлы, потому что некоторые файлы больше 200 МБ. Также пользователю придется ждать завершения буферизации, пока он не начнет загружать файл.Загрузить удаленный файл с curl напрямую

Я нашел скрипт для загрузки файла с удаленного сервера напрямую:

<?php 
$file_name = $_GET['file']; 
$file_url = 'http://www.remote.tld/' . $file_name; 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url); 
exit; 
?> 

этого видом прямой удаленной загрузки также можно с завитком?

+0

Возможно, но я не понимаю, зачем вам это нужно. Разумеется, лучше использовать более надежно существующие функции PHP? (Если, возможно, вы отключили 'allow_fopen_url' ...) – lonesomeday

ответ

5

Вам нужно будет прочитать и вывести файл в виде кусков, так как весь 200 МБ-файл, вероятно, не будет вписываться в память вашего PHP-скрипта.

См. this question, как это сделать в curl. Существует живой пример в the manual. Украденное и модифицированное из этого, что-то вроде этого должно работать (непроверено):

<?php 
curl_setopt($this->curl_handle, CURLOPT_WRITEFUNCTION, "receiveResponse"); 

function receiveResponse($curlHandle,$data) 
    { 
         echo $data; // Ouput to the user 
         $length = strlen($data); 
         return $length; 

       } 
?> 

Обратите внимание, что это редко бывает хорошей идеей. Это накладывает относительно большую нагрузку на сервер - если у вас есть достаточно высокие номера трафика, это высокая цена, чтобы заплатить за тщеславие того, чтобы служить загрузке. Также, конечно, загрузка в 200 МБ создаст 400 МБ вашего счета за трафик!

+0

Привет, спасибо за ваш ответ и ваши подсказки. Думаю, я попытаюсь справиться с этим без завитки. Во всяком случае, это очень интересно. Я не знал, что могу использовать функцию write ... –

0

Вы не можете обслуживать файл с вашего сервера, не буферизируя его на своем сервере.

Техническое решение отсутствует, также не с CURL, так как у вас нет доступа к DNS-серверу противоположного сервера, чтобы скрыть противоположный URL.

Смежные вопросы