美文网首页
php 下载图片

php 下载图片

作者: 云龙789 | 来源:发表于2019-03-18 16:39 被阅读0次

下载图片的处理其实也很简单,就是读取图片内容,然后将数据写入到一个自定义的文件, 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()
}

相关文章

网友评论

      本文标题:php 下载图片

      本文链接:https://www.haomeiwen.com/subject/fzkbmqtx.html