项目背景:新疆seo博客。

项目需求:想在发布文章的时候自动下载粘贴过来的网络图片

项目结构:


  1. 自动保存图片的操作写入到模型中
  2. 自动下载图片保存到本地并且返回图片地址的方法写入公共方法中方便扩展
  3. 如果对附件管理有需求可添加相应的数据表结构

实现步骤:

一、在文章模型中建立相应的增加或者修改的方法

二、在方法中植入代码


//进行正则匹配 匹配gif,jpg,jpeg,bmp,png后缀的图片 如果有特别需要根据自己的情况修改正则
//$content 变量是string类型 是文章内容 $matches是正则结果
preg_match_all("/(src)=(["|']?)([^ "'>]+.(gif|jpg|jpeg|bmp|png))2/i", $content, $matches);
//下载临时数组
$_down_cache = [];
//如果有匹配到图片
if (is_array($matches[3])) {
    //开始遍历
    foreach ($matches[3] as $key => $value) {

        //妈了个蛋 这里正则匹配是否包含http的外链 和判断去除本站的图片地址 一定要用绝对等于
        //这个地方可以判断当前图片的url是否包含本站域名如果不包含才进行下载
        if (preg_match("/http(?:s?)://((?:[A-za-z0-9-]+.)+[A-za-z]{2,4})/", $value) == 1 && strpos($value, 'xjyili.cn') === false) {
            //下载内容中的远程图片并且进行替换  DownImages公共函数会在下面贴出来
            $_down_loading = DownImages($value);
            //把新的地址替换到文章内容中去
            $content = str_replace($value,$_down_loading,$content);
            //临时数组 可以来存储文章内容中的图片数据可以自己做定制开发
            $_down_cache[] = ['image_cover'=>$_down_loading];
            //这里你们可以做相应处理比如记录附件管理等
        }else{
            //临时数组 可以来存储文章内容中的图片数据可以自己做定制开发
            $_down_cache[] = ['image_cover'=>$value];

        }

    }

}

DownImages公共函数代码如下

function DownImages($url){
    if (!$url) return false;
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //运行curl,结果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    $ext = pathinfo($url, PATHINFO_EXTENSION);
    $dirs = './uploads/article/cache/'.date('Ymd').'/';//这是我定的保存文章图片的目录
    $filename = md5(time()).'.'.$ext;
    $dir = iconv("UTF-8", "GBK", $dirs);
    if (!file_exists($dir)){
        mkdir ($dir,0777,true);
        //echo '创建文件夹bookcover成功';
    } else {
        //echo '需创建的文件夹bookcover已经存在';
    }
    //取出返回数据
    $save_file = $dirs.$filename;
    file_put_contents($save_file,$res); 
    $ref = '/uploads/article/cache/'.date('Ymd').'/'.$filename;
    if ((int)config('Index_setting_upload.type') == 2) {//这个地方设置了是否需要上传至阿里云oss或者七牛云
        $UploadService = new appcommonserviceUpload;//这是我自己封装的上传类库如需的话可以联系我
       $refault = $UploadService::uploadFile('.'.$ref,substr($ref,1));//获取上传结果
       @unlink('.'.$ref);//删除本地文件
       $src= (string)config('Index_setting_upload.bucketDomain').substr($ref,1);//返回文章的新地址
    }else{
        $src= request()->domain().$ref;//直接把本地的地址返回
    }
    return $src;
}
小结,至此文章内容远程图片自动下载就算完了,需要注意的是正则只对后缀正常的图片起作用。对百度图片或者维系那公众号的后缀就很无力了!

有啥问题或者需求欢迎联系我😂!