最近写了一个新需求,要求是采集回来的文章,图片替换成自己的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; } }
标签:七牛云,img,url,采集,传到,file,return,save,dir From: https://www.cnblogs.com/seanpan/p/16818261.html