如何用cURL部分下载远程文件?

是否可以用cURL部分下载远程文件? 比方说,远程文件的实际文件大小是1000 KB。 我怎样才能只下载第一个500 KB的呢?

您还可以使用php-curl扩展名来设置范围标题参数。

$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; 

但如前所述,如果服务器不尊重这个头,但发送整个文件curl将下载所有的。 例如http://www.php.net忽略标题。; 但是,您可以(另外)设置写入函数callback,并在收到更多数据时中止请求,例如

 // 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); 

获取文档的前100个字节:

 curl -r 0-99 http://www.get.this 

从手册

确保你有一个现代的curl

这可能是你的解决scheme(下载第一个500KBoutput.txt

 curl -r 0-511999 http://www.yourwebsite.com > output.txt 
  • 511999500^1024-1

谢谢你的解决schemeVolkerK。 不过,我需要使用这个代码作为一个函数,所以这就是我想出的。 我希望这对别人有用。 主要区别在于使用($ limit,&$ datadump),因此可以传递一个限制,并使用引用variables$ datadump来返回结果。 我还添加了CURLOPT_USERAGENT,因为有些网站不允许没有用户代理头的访问。

检查http://php.net/manual/en/functions.anonymous.php

 function curl_get_contents_partial($url, $limit) { $writefn = function($ch, $chunk) use ($limit, &$datadump) { static $data = ''; $len = strlen($data) + strlen($chunk); if ($len >= $limit) { $data .= substr($chunk, 0, $limit - strlen($data)); $datadump = $data; return -1; } $data .= $chunk; return strlen($chunk); }; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); //curl_setopt($ch, CURLOPT_RANGE, '0-1000'); //not honored by many sites, maybe just remove it altogether. curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn); $data = curl_exec($ch); curl_close($ch); return $datadump; } 

用法:
$ page = curl_get_contents_partial(' http ://some.webpage.com',1000); //读取前1000个字节
echo $ page //或者做结果。