最近写了一个新需求,要求是采集回来的文章,图片替换成自己的url,可以选择保存本地或者七牛云

七牛云原方案是 下载到本地,但是获取不到,就作罢了,改用七牛云异步第三方资源抓取的方案

具体代码参考一下把

 

<?php
namespace app\admin\controller;
use think\Controller;
use think\Db;
use Think\Config;
use org\Upload;

use Qiniu\Auth;
use Qiniu\Http\Client;
/*
图片转换
*/
class Image extends Common
{

    /**
    * 设置文章内容图片,上传到本地服务器处理 
    * @param $content  文章内容
    * @return bool
    */
    public function setContentImg($content)
    {
        // return $content;
        // 1.先正则匹配出所有的图片url
        $pattern = '#<img(.+?)src\s*=\s*[\"|\']([^"|^\']+?)[\"|\']([^>]*?)>#';
        preg_match_all($pattern, $content, $match);
        $url_list = $match[2];
        if (!$url_list) {
            return $content;
        }
        $url_list = array_unique($url_list); // 图片去重
        $local_url = $_SERVER['HTTP_HOST']; // 获取当前网站域名

        // 循环图片
        foreach ($url_list as $img_url) {
            // 判断是否为系统上传的,如果是则跳过
            $qiniudomain = strpos($img_url, set('qiniudomain'));
            $cunzaibendi = strpos($img_url, $local_url);
            if ($qiniudomain || $cunzaibendi) {continue;}

            // 上传至本地或七牛云
            if (set('qiniu')==1) {
                // $img_yun_url = $this->imgYunUrl($img_local['save_path']);
                $qiniuFetch = $this->qiniuFetch($img_url);
                // dump($qiniuFetch['img_yun_url']);die;
                $img_set_url = $qiniuFetch['img_yun_url'];
            } else {
                // 下载至本地文件夹
                $save_dir = 'uploads/article/' . uniqid() . DS;
                $img_local = $this->downloadImage($img_url, $save_dir);
                $img_set_url = 'http://'.$local_url .'/'. $save_dir. $img_local['file_name'];
            }

            // 替换掉文章的路径
            $content = str_replace($img_url, $img_set_url, $content);
        }
        // 如果是上传至七牛云,则替换后删除整个临时文件夹
        if (set('qiniu')==1) {
            $this->deldir($save_dir);
        }

        return $content;
    }


    /**
    * 删除整个临时文件夹和文件 
    * @param $dir  文件夹路径
    * @return bool
    */
    public function deldir($dir) {
        //先删除目录下的文件:
        $dh=opendir($dir);
        while ($file=readdir($dh)) {
            if($file!="." && $file!="..") {
                $fullpath=$dir."/".$file;
                if(!is_dir($fullpath)) {
                    unlink($fullpath);
                } else {
                    deldir($fullpath);
                }
            }
        }
        closedir($dh);
        //删除当前文件夹:
        if(rmdir($dir)) {
            return true;
        } else {
            return false;
        }
    }

    /**
    * 下载远程图片保存到本地 
    * @param $url  文件url
    * @param $save_dir  保存文件目录
    * @param $filename  保存文件名称
    * @param $type  使用的下载方式
    * @return bool
    */
    public function downloadImage($url,$save_dir='',$filename='',$type=0){ 
        if(trim($url)==''){ 
            return array('file_name'=>'','save_path'=>'','error'=>1); 
        } 
        if(trim($save_dir)==''){ 
            $save_dir='./'; 
        } 
        if(trim($filename)==''){//保存文件名 
            $ext=strrchr($url,'.'); 
            if($ext!='.gif'&&$ext!='.jpg'){ 
                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); 
        } 
        //获取远程文件所采用的方法  
        if($type){ 
            $ch=curl_init(); 
            $timeout=5; 
            curl_setopt($ch,CURLOPT_URL,$url); 
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
            curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); 
            $img=curl_exec($ch); 
            curl_close($ch); 
        }else{ 
            ob_start();  
            readfile($url); 
            $img=ob_get_contents();  
            ob_end_clean();  
        } 
        //文件大小  
        $fp2=@fopen($save_dir.$filename,'a'); 
        fwrite($fp2,$img); 
        fclose($fp2); 
        unset($img,$url); 
        return array('file_name'=>$filename, 'save_path'=>$save_dir.$filename); 
    }


    /**
    * 图片上传至本地或七牛云 (根据图片路径不能获取到文件对象,此方案先废弃)
    * @param $img_local_url  文件路径
    * @return bool
    */
    public function imgYunUrl($img_local_url)
    {
        $file = getimagesize($img_local_url);
        $file['tmp_name'] = $img_local_url;
        dump($file);die;
        $v = 0;
        // 七牛
        $driverConfig = ['secrectKey' => set('secrectKey'), 'accessKey' => set('accessKey'), 'domain' => set('qiniudomain'), 'bucket' => set('qiniubucket')];
        $setting['exts'] = explode(',', 'png,jpg,jpeg,gif,bmp');
        $setting['maxSize'] = 50 * 1024 * 1024;
        $Upload = new Upload($setting, 'Qiniu', $driverConfig);
        $info = $Upload->uploadOne($file);
        var_dump($info);die;
        if ($info) {
            $data[$v]['url'] = $info['url'];
            $data[$v]['alt'] = $info['name'];
            $data[$v]['href'] = '';
            $data[$v]['getInfo'] = $info;
        } else {
            // 上传失败获取错误信息
            return $Upload->getError();
        }
        return $data;
    }


    /*
    * 七牛云异步第三方资源抓取
    * $img_url 文件url
    * @return Qiniu\Http\Response Object
    */
    public function qiniuFetch($img_url)
    {
        $secrectKey = set('secrectKey');
        $accessKey = set('accessKey');
        $qiniubucket = set('qiniubucket');
        $qiniudomain = set('qiniudomain');
        $zone = 'z2'; // 华东:z0;华北z1;华南:z2;北美:na0;东南亚:as0

        $file_dir = 'article/'.date('Ymd').'/'; // 文件路径
        $file_type = pathinfo(parse_url($img_url)['path'])['extension'];// 文件类型(文件直接上传,七牛云不会指定文件类型,需要自己定义)
        $file_name = time() . uniqid().'.'.$file_type; // 文件名

        $bodyArr = ["url" => $img_url, "bucket" => $qiniubucket, "key" => $file_dir . $file_name];
        $body = json_encode($bodyArr);

        $this->auth = new Auth($accessKey, $secrectKey);
        $url = 'http://api-'.$zone.'.qiniu.com/sisyphus/fetch';
        $method = 'POST';
        $contentType = 'application/json';
        $rtcToken = $this->auth->authorizationV2($url, $method, $body, $contentType);
        $rtcToken['Content-Type'] = $contentType;
        $result =  Client::post($url, $body, $rtcToken);

        // 成功则返回七牛云url,失败则返回原url
        if ($result->statusCode == 200) {
            $data['img_yun_url'] = 'http://'.$qiniudomain.'/'.$file_dir . $file_name;
        } else {
            $data['img_yun_url'] = $img_url;
        }
        return $data;
    }


}

 

原文地址:http://www.cnblogs.com/seanpan/p/16818261.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性