본문 바로가기

study

[PHP] curl을 이용한 원격지 이미지 파일 저장

php의 curl을 이용해서 원격지의 이미지 파일을 로컬 서버에 저장하는 기능을 수행하는 코드이다. curl 사용이 가능한 환경이어야 하며 원격지의 파일은 curl에서 접근이 가능해야 한다. 파일 다운로드 후 getimagesize 함수를 이용해 타입을 실제 파일의 타입을 체크하고 gif, jpg, png 파일이 아니면 삭제하도록 했다. curl에서 파일 체크 후 http code가 200일 때만 실행되도록 했으며 파일의 용량이 크다면 CURLOPT_CONNECTTIMEOUT 설정을 변경해서 다운로드를 할 수도 있다.

<?php
function save_remote_image($url, $dir)
{
    $filename = '';

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_NOBODY, true);

    curl_exec ($ch);

    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if($http_code == 200) {
        $filename = basename($url);
        if(preg_match("/\.(gif|jpg|jpeg|png)$/i", $filename)) {
            $tmpname = date('YmdHis').(microtime(true) * 10000);
            $filepath = $dir;
            @mkdir($filepath, '0755');
            @chmod($filepath, '0755');

            // 파일 다운로드
            $path = $filepath.'/'.$tmpname;
            $fp = fopen ($path, 'w+');

            $ch = curl_init();
            curl_setopt( $ch, CURLOPT_URL, $url );
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
            curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
            curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
            curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
            curl_setopt( $ch, CURLOPT_FILE, $fp );
            curl_exec( $ch );
            curl_close( $ch );

            fclose( $fp );

            // 다운로드 파일이 이미지인지 체크
            if(is_file($path)) {
                $size = @getimagesize($path);
                if($size[2] < 1 || $size[2] > 3) {
                    @unlink($path);
                    $filename = '';
                } else {
                    $ext = array(1=>'gif', 2=>'jpg', 3=>'png');
                    $filename = $tmpname.'.'.$ext[$size[2]];
                    rename($path, $filepath.'/'.$filename);
                    chmod($filepath.'/'.$filename, '0644');
                }
            }
        }
    }

    return $filename;
}
?>
Copy

위 코드는 이미지만 다운로드 하지만 코드를 변경하면 다른 파일도 다운로드 가능하다.