curl을 사용하여 대용량 파일 다운로드


87

curl을 사용하여 원격 파일을 다운로드해야합니다.

내가 가지고있는 샘플 코드는 다음과 같습니다.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$st = curl_exec($ch);
$fd = fopen($tmp_name, 'w');
fwrite($fd, $st);
fclose($fd);

curl_close($ch);

그러나 먼저 메모리로 읽어 오기 때문에 큰 파일을 처리 할 수 ​​없습니다.

파일을 디스크로 직접 스트리밍 할 수 있습니까?

답변:


168
<?php
set_time_limit(0);
//This is the file where we save the    information
$fp = fopen (dirname(__FILE__) . '/localfile.tmp', 'w+');
//Here is the file we are downloading, replace spaces with %20
$ch = curl_init(str_replace(" ","%20",$url));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
// write curl response to file
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// get curl response
curl_exec($ch); 
curl_close($ch);
fclose($fp);
?>

5
귀하의 의견 @ yes123을 지켜라, 알고 싶습니다.
Jürgen Paul

8
내가 틀렸다면 정정하십시오.하지만 fwrite.NET을 사용하고 있기 때문에 실제로 데이터 를 수동으로 작성할 필요가 없다고 생각합니다 CURLOPT_FILE.
Sasha Chedygov

1
@SashaChedygov가 위에서 지적했듯이 fwriteAND 를 사용할 필요가 없습니다 CURLOPT_FILE. 통과하면 $fp충분합니다. 나는 둘 다 해냈고 1파일의 내용이 끝났습니다 .
2013 년

@Sasha Chedygov는 ~ 그래 당신은 필요 없어요fwrite
알리레자

5
CURLOPT_RETURNTRANSFER를 설정하기 전에 CURLOPT_FILE을 설정하면 작동하지 않는 것 같습니다. 아마도 CURLOPT_FILE이 설정되는 CURLOPT_RETURNTRANSFER에 의존하기 때문일 것입니다. php.net/manual/en/function.curl-setopt.php#99082
나비 KAZ

25

이 편리한 기능을 사용합니다.

4094 바이트 단계로 다운로드하면 메모리가 가득 차지 않습니다.

function download($file_source, $file_target) {
    $rh = fopen($file_source, 'rb');
    $wh = fopen($file_target, 'w+b');
    if (!$rh || !$wh) {
        return false;
    }

    while (!feof($rh)) {
        if (fwrite($wh, fread($rh, 4096)) === FALSE) {
            return false;
        }
        echo ' ';
        flush();
    }

    fclose($rh);
    fclose($wh);

    return true;
}

용법:

     $result = download('http://url','path/local/file');

그런 다음 모든 것이 정상인지 확인할 수 있습니다.

     if (!$result)
         throw new Exception('Download error...');

1
@Severus는 fopen()false 를 반환하고 시간 초과를 반환하는 http 오류를 catch 합니다. while 루프에 넣습니다 ( time()수학을 호출 하고 수행)
Silviu-Marian

2
cURL은 이미 이것을 구현하고 있습니다 (허용 된 답변 참조), 왜 스스로 구현하고 싶습니까?
Petr Peller 2013

2
컬 절차 인터페이스는 아주 나쁜이기 때문에
동적은

그만한 가치가 있기 때문에 stream_copy_to_stream수동으로 내용을 복사 하는 대신 사용하여 코드를 더 짧게 만듭니다. 이것도 저것도 작동 https하지 않습니다 (을 규정하지 않는 한 $context). 절차 적 스타일의 결합-파일 함수도 OOP가 아니며 배열에 curl 옵션을 넣으면 어쨌든 훨씬 깔끔해 보일 것입니다.
ashein

https로 테스트했고 훌륭하게 작동합니다 !!!, @dynamic을 도와 주셔서 감사합니다.
Ozal Zarbaliyev

6

지정된 URL의 내용을 다운로드하려면 아래 코드를 찾아 파일에 저장하십시오.

<?php
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL,'http://news.google.com/news?hl=en&topic=t&output=rss');

$fp = fopen('rss.xml', 'w+');
/**
* Ask cURL to write the contents to a file
*/
curl_setopt($ch, CURLOPT_FILE, $fp);

curl_exec ($ch);

curl_close ($ch);
fclose($fp);
?>

FTP 서버에서 파일을 다운로드하려면 php FTP 확장을 사용할 수 있습니다. 아래 코드를 찾으십시오.

<?php
$SERVER_ADDRESS="";
$SERVER_USERNAME="";
$SERVER_PASSWORD="";
$conn_id = ftp_connect($SERVER_ADDRESS);

// login with username and password
$login_result = ftp_login($conn_id, $SERVER_USERNAME, $SERVER_PASSWORD);

$server_file="test.pdf" //FTP server file path 
$local_file = "new.pdf"; //Local server file path 

##----- DOWNLOAD $SERVER_FILE AND SAVE TO $LOCAL_FILE--------##
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
    echo "Successfully written to $local_file\n";
} else {
    echo "There was a problem\n";
}

ftp_close($conn_id);
?>

4

curl큰 파일을 다운로드하는 데 사용되는 경우CURLOPT_TIMEOUT 설정해야하는 주요 옵션입니다.

CURLOPT_RETURNTRANSFER pdf / csv / image 등과 같은 파일을받는 경우에는 사실이어야합니다.

여기에서 자세한 내용을 확인할 수 있습니다 (올바른 URL). Curl Doc

해당 페이지에서 :

curl_setopt($request, CURLOPT_TIMEOUT, 300); //set timeout to 5 mins

curl_setopt($request, CURLOPT_RETURNTRANSFER, true); // true to get the output as string otherwise false

u는 또한 곱슬와 파일 다운로드에 관한 블로그 예를 통해 갈 수 이해 컬의 기초를
프라 샨트 판 데이

2

이 함수를 사용하면 파일 시스템에 임시 파일을 만들고 모든 것이 제대로 작동하면 다운로드 한 파일의 경로를 반환합니다.

function getFileContents($url)
{
    // Workaround: Save temp file
    $img = tempnam(sys_get_temp_dir(), 'pdf-');
    $img .= '.' . pathinfo($url, PATHINFO_EXTENSION);

    $fp = fopen($img, 'w+');

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    $result = curl_exec($ch);
    curl_close($ch);

    fclose($fp);

    return $result ? $img : false;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.