php 下载图片

下载图片的处理其实也很简单,就是读取图片内容,然后将数据写入到一个自定义的文件, file_get_contents() 和 curl 都可以处理。但是建议还是使用 curl ,因为有 https 的图片会需要 ssl 处理。
咱们一般抓取图片存入本地后,会将url 存入数据库。根据我自己的使用情况,我发现了有几点需要注意的。

1.  `$file = curl_exec($ch);` 这个值时 false 的时候时读取图片数据失败的,就不要再插入数据库了
2.  打开文件夹的时候,最后必须要有斜杠的`/`。不然会出错
3.对于文件夹的创建 `mkdir($this->base_path, 0777, true);`, true 参数时表示可以循环创建目录
  • demo
<?php

/**
 * 下载图片
 * Class Spider
 */
class Spider
{

    private $code; // 状态码
    private $message; // 消息
    /**
     * 图片位置的根路径
     * @var string
     */
    private $base_path;

    /**
     * url 对应的路径
     * @var string
     */
    private $url_path;


    /**
     * @param $url
     * @param string $path
     * @return string
     * @throws Exception
     */
    public function downloadImage($url, $path = '1/')
    {
        $this->base_path = dirname(__DIR__) . '/pictures/' . $path; // 将传递的路径,主动拼接上根图片目录
        $this->url_path = '/pictures/' . $path;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在

        $file = curl_exec($ch);
        curl_close($ch);
        if ($file == false) {
            //  图片下载失败
            $this->code = -1;
            $this->message = '图片下载失败';
            return false;
        }
        //  文件夹时需要添加 / 的
        if (substr($this->base_path, -1, 1) !== '/') {
            $this->base_path = $this->base_path . '/';
        }
        return $this->saveAsImage($url, $file);
    }


    /**
     * 保存图片并返回url
     * @param $url
     * @param $file
     * @return string
     * @throws Exception
     */
    private function saveAsImage($url, $file)
    {
        $extension = pathinfo($url, PATHINFO_EXTENSION); //  获取图片后缀
        $filename = uniqid(microtime(true)) . '.' . $extension; // 为图片生成唯一文件名

        //  如果文件夹不存在,则生成
        if (!file_exists($this->base_path)) {
            $make_path = mkdir($this->base_path, 0777, true);
            if (!$make_path) {
                $this->code = -2;
                $this->message = '保存图片时,创建文件夹';
                return false;
            }
        }

        $resource = fopen($this->base_path . $filename, 'a');
        fwrite($resource, $file);
        fclose($resource);
        return 'http://' . $_SERVER['SERVER_NAME'] . $this->url_path . '/' . $filename;
    }

    /**
     * 获取 message
     * @return string
     */
    public function getMessage()
    {
        return $this->message;
    }

    /**
     * 获取正太吗
     * @return int
     */
    public function getCode()
    {
        return $this->code;
    }
}
  • 应用
$pic_url = $spider->downloadImage($img_url, $path);
if (!$pic_url) {
  // 错误处理
// 错误信息  $spider->getMessage() 
//  错误状态码  $spider->getCode()
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容