Можно ли получить последние 1 Мбайт данных файла с помощью cURL? Я знаю, что могу получить первый MB, но мне нужен последний.
Да, вы можете это сделать, указав заголовок HTTP Range в своем запросе:
// $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);
Я знаю, что это старый вопрос, но вы можете сделать это, указав только верхний диапазон:
$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 :
По своему выбору last-byte-pos клиент может ограничить количество полученных байтов, не зная размера объекта.