Is it possible to partially download a remote file with cURL? Let's say, the actual filesize of remove file is 1000 KB. How can I download only first 500 KB of it?
+5
A:
Get the first 100 bytes of a document:
curl -r 0-99 http://www.get.this/
from the manual
make sure you have a modern curl
SpliFF
2010-01-09 09:36:58
You are correct, however I found that it's not always reliable and depends on the server and not curl itself. In the misbehaving cases, curl would just keep downloading.
Artem Russakovskii
2010-01-09 09:40:35
A:
This could be your solution (download first 500KB into output.txt)
curl -r 0-511999 http://www.yourwebsite.com > output.txt
- while
511999
is500^1024-1
amir beygi
2010-01-09 12:41:25
+4
A:
You can also set the range header parameter with the php-curl extension.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.spiegel.de/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
But as noted before if the server doesn't honor this header but sends the whole file curl will download all of it. E.g. http://www.php.net ignores the header. But you can (in addition) set a write function callback and abort the request when more data is received, e.g.
// php 5.3+ only
// use function writefn($ch, $chunk) { ... } for earlier versions
$writefn = function($ch, $chunk) {
static $data='';
static $limit = 500; // 500 bytes, it's only a test
$len = strlen($data) + strlen($chunk);
if ($len >= $limit ) {
$data .= substr($chunk, 0, $limit-strlen($data));
echo strlen($data) , ' ', $data;
return -1;
}
$data .= $chunk;
return strlen($chunk);
};
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.php.net/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
$result = curl_exec($ch);
curl_close($ch);
VolkerK
2010-01-09 13:10:18
+1 for good answer. This works because $writefn() returns -1 when the limit is reached. When the callback function returns anything other than the number of bytes passed to it (in $chunk), curl aborts the connection.
GZipp
2010-01-09 16:09:07
Excellent. When I was doing the same in Perl, I had to use an alarm that triggered and checked for the file size, for the lack of a better method. Very hacky but it worked.
Artem Russakovskii
2010-01-09 20:03:09