php下載遠程圖片到本地


在使用 PHP 做簡單的爬蟲的時候,我們經常會遇到需要下載遠程圖片的需求,所以下面來簡單實現這個需求
1:使用curl

比如我們有下面這兩張圖片:

$images = [
    'https://img.alicdn.com/tps/TB1jjaYOFXXXXa2aXXXXXXXXXXX-276-402.jpg_150x10000q90.jpg',
    'https://img.alicdn.com/tfs/TB15QQ5cgMPMeJjy1XbXXcwxVXa-520-280.jpg_q90_.webp'
];

第一步,我們可以直接來使用最簡單的代碼實現:

function download($url, $path = 'images/')
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    $file = curl_exec($ch);
    curl_close($ch);
    $filename = pathinfo($url, PATHINFO_BASENAME);
    $resource = fopen($path . $filename, 'a');
    fwrite($resource, $file);
    fclose($resource);
}

那么在下載遠程圖片的時候就可以這樣:

foreach ( $images as $url ) {
    download($url);
}

1:封裝成一個類
縷清思路之后,我們可以將這個基本的功能封裝到一個類中:

class Spider {

    public function downloadImage($url, $path = 'images/')
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        $file = curl_exec($ch);
        curl_close($ch);
        $filename = pathinfo($url, PATHINFO_BASENAME);
        $resource = fopen($path . $filename, 'a');
        fwrite($resource, $file);
        fclose($resource);
    }
}    

或者,我們還可以這樣稍微優化一下:

class Spider {

    public function downloadImage($url, $path='images/')
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        $file = curl_exec($ch);
        curl_close($ch);

        $this->saveAsImage($url, $file, $path);
    }

    private function saveAsImage($url, $file, $path)
    {
        $filename = pathinfo($url, PATHINFO_BASENAME);
        $resource = fopen($path . $filename, 'a');
        fwrite($resource, $file);
        fclose($resource);
    }
}    

封裝成類之后,我們可以這樣調用代碼來下載圖片:

$spider = new Spider();

foreach ( $images as $url ) {
    $spider->downloadImage($url);
}

這樣,對一般可訪問的遠程圖片下載就OK了....

或者再這樣完善下下載方法的封裝:

    /**
     * 下載遠程圖片保存到本地
     * @access public
     * @author      lxhui<772932587@qq.com>
     * @since 1.0
     * @return array
     * @params string $url 遠程圖片地址
     * @params string $save_dir 需要保存的地址
     * @params string $filename 保存文件名
     */
    function download($url, $save_dir = './public/upload/loan/',$filename='')
    {
        if(trim($save_dir)=='')
            $save_dir='./';

        if(trim($filename)==''){//保存文件名
            $allowExt = array('gif', 'jpg', 'jpeg', 'png', 'bmp');
            $ext=strrchr($url,'.');
            if(!in_array($ext,$allowExt))
                return array('file_name'=>'','save_path'=>'','error'=>3);

            $filename=time().$ext;
        }
        if(0!==strrpos($save_dir,'/'))
            $save_dir.='/';

        //創建保存目錄
        if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true))
            return array('file_name'=>'','save_path'=>'','error'=>5);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        $file = curl_exec($ch);
        curl_close($ch);
        $filename = pathinfo($url, PATHINFO_BASENAME);
        $resource = fopen($save_dir . $filename, 'a');
        fwrite($resource, $file);
        fclose($resource);
        unset($file,$url);
        return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM