2012-12-11 1 views
3

Возможно ли получить последние 1 МБ данных файла с помощью cURL? Я знаю, что могу получить первый MB, но мне нужен последний.Получение последнего МБ файла с cURL

+0

Прочтите весь файл и возьмите последний 1MB. –

+0

Да, но идея состоит в том, чтобы не читать весь файл. – pvledoux

+2

@RobertHarvey: Это кажется немного расточительным, в зависимости от того, насколько велик файл. Возможно, добавив в запрос заголовка [range header] (http://tools.ietf.org/html/rfc2616#section-14.35), вы можете получить последние 1 МБ данных. –

ответ

4

Да, вы можете сделать это, указав заголовок Range HTTP в запросе:

// $curl = curl_init(...); 
$lower = $size - 1024 * 1024; 
$upper = $size; 
url_setopt($curl, CURLOPT_HTTPHEADER, array("Range: bytes=$lower-$upper")); 

Примечание: Вы должны убедиться, что сервер, который вы запрашиваете данные позволяет. Сделайте запрос HEAD и проверьте заголовок Accept-Ranges.

Вот пример того, что вы должны быть в состоянии настроить в соответствии с вашими потребностями:

// Make HEAD request 
$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_HEADER, true); 
curl_setopt($curl, CURLOPT_NOBODY, true); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
$data = curl_exec($curl); 

preg_match('/^Content-Length: (\d+)/m', $data, $matches); 
$size = (int) $matches[1]; 
$lower = $size - 1024 * 1024; 

// Get last MB of data 
curl_setopt($curl, CURLOPT_HEADER, false); 
curl_setopt($curl, CURLOPT_HTTPGET, true); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Range: bytes=$lower-$size")); 

$data = curl_exec($curl); 
0

Я знаю, что это старый вопрос, но вы можете сделать это, указав только верхний диапазон:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://example.com"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

// Get the last 100 bytes and echo the results 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: bytes=-100")); 
echo htmlentities(curl_exec($ch)) . "<br /><br />"; 

// Get the last 200 bytes and echo the results 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: bytes=-200")); 
echo htmlentities(curl_exec($ch)); 

Это возвращает:

100 bytes: <p><a href="http://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> 

200 bytes: ou may use this domain in examples without prior coordination or asking for permission.</p> <p><a href="http://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> 

От RFC 2616:

По своему выбору последнего байта клиент может ограничить количество полученных байтов, не зная размера объекта.

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