2010-01-09 3 views
21

cURL을 사용하여 원격 파일을 부분적으로 다운로드 할 수 있습니까? 예를 들어, 원격 파일의 실제 파일 크기는 1000KB입니다. 어떻게 처음 500KB 만 다운로드 할 수 있습니까?cURL을 사용하여 원격 파일을 부분적으로 다운로드하는 방법은 무엇입니까?

+0

: https://unix.stackexchange.com/questions/121314/download-only-a-part-of-a-file 당신은 올바른 그러나 나는 항상 신뢰할 수 없습니다 그리고 의존한다는 것을 발견 –

답변

34

입니다.

그러나 서버가이 헤더를 따르지는 않지만 전체 파일을 보내면 curl이 모든 것을 다운로드합니다. 예 : http://www.php.net은 헤더를 무시합니다. 그러나 더 많은 데이터가 수신되면 쓰기 함수 콜백을 설정하고 요청을 중단 할 수 있습니다 (예 :

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

+1입니다. 한계에 도달하면 $ writefn()이 -1을 반환하기 때문에이 작업이 가능합니다. 콜백 함수가 전달 된 바이트 수 ($ chunk)를 반환하면 curl은 연결을 중단합니다. – GZipp

+0

우수. Perl에서 동일한 작업을 수행 할 때 더 나은 방법이 없기 때문에 파일 크기를 트리거하고 확인한 알람을 사용해야했습니다. 매우 해키지만 작동했습니다. –

+0

내가 필요한 것. 그러나 언급 할만한 가치는 '청크'크기를 정의하는 CURLOPT_BUFFERSIZE입니다. 따라서 버퍼가 매우 크면 청크 크기에 어쨌든 전체 웹 페이지가 포함될 수 있습니다 (필자는 생각합니다!) –

17

문서의 첫 100 바이트 가져 오기 : 당신이 (다운로드 솔루션이 될 수

+3

서버 자체에 말려 있지 않다. 오작동의 경우, 컬은 계속해서 다운로드를 계속합니다. –

+0

다른 범위 (예 : 100-200)를 사용하면 다운로드 할 수 없습니다. 나는 "curl error (18)"를 얻는다. 이게 해결 될 수 있니? 좋은 대답은 – akashrajkn

0

현대 컬이 있는지 확인

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

수동

에서을 첫 500킬로바이트output.txt)

curl -r 0-511999 http://www.yourwebsite.com > output.txt 
  • 511999 동안 당신은 또한 PHP 컬 확장자 범위 헤더 매개 변수를 설정할 수 있습니다 500^1024-1
0

멋진 솔루션 VolkerK에 감사드립니다. 그러나이 코드를 함수로 사용해야하므로 여기서 생각해 냈습니다. 다른 사람들에게 유용하기를 바랍니다. 주된 차이점은 ($ limit, & $ datadump)입니다. 한도를 넘기면 참조 변수 $ 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; 
} 

사용 :
$ 페이지 = curl_get_contents_partial ('http://some.webpage.com', 1000); // 처음으로 1000 바이트
echo $ page //를 읽거나 결과와 관계없이 작업하십시오. 헤더를 사용

관련 문제