項目背景:新疆seo博客。

項目需求:想在發(fā)布文章的時候自動下載粘貼過來的網(wǎng)絡(luò)圖片

項目結(jié)構(gòu):


  1. 自動保存圖片的操作寫入到模型中
  2. 自動下載圖片保存到本地并且返回圖片地址的方法寫入公共方法中方便擴(kuò)展
  3. 如果對附件管理有需求可添加相應(yīng)的數(shù)據(jù)表結(jié)構(gòu)

實現(xiàn)步驟:

一、在文章模型中建立相應(yīng)的增加或者修改的方法

二、在方法中植入代碼


//進(jìn)行正則匹配 匹配gif,jpg,jpeg,bmp,png后綴的圖片 如果有特別需要根據(jù)自己的情況修改正則
//$content 變量是string類型 是文章內(nèi)容 $matches是正則結(jié)果
preg_match_all("/(src)=(["|']?)([^ "'>]+.(gif|jpg|jpeg|bmp|png))2/i", $content, $matches);
//下載臨時數(shù)組
$_down_cache = [];
//如果有匹配到圖片
if (is_array($matches[3])) {
????//開始遍歷
    foreach ($matches[3] as $key => $value) {

        //媽了個蛋 這里正則匹配是否包含http的外鏈 和判斷去除本站的圖片地址 一定要用絕對等于
????????//這個地方可以判斷當(dāng)前圖片的url是否包含本站域名如果不包含才進(jìn)行下載
        if (preg_match("/http(?:s?)://((?:[A-za-z0-9-]+.)+[A-za-z]{2,4})/", $value) == 1 && strpos($value, 'xjyili.cn') === false) {
            //下載內(nèi)容中的遠(yuǎn)程圖片并且進(jìn)行替換  DownImages公共函數(shù)會在下面貼出來
????????????$_down_loading = DownImages($value);
????????????//把新的地址替換到文章內(nèi)容中去
            $content = str_replace($value,$_down_loading,$content);
????????????//臨時數(shù)組 可以來存儲文章內(nèi)容中的圖片數(shù)據(jù)可以自己做定制開發(fā)
            $_down_cache[] = ['image_cover'=>$_down_loading];
????????????//這里你們可以做相應(yīng)處理比如記錄附件管理等
        }else{
????????????//臨時數(shù)組 可以來存儲文章內(nèi)容中的圖片數(shù)據(jù)可以自己做定制開發(fā)
            $_down_cache[] = ['image_cover'=>$value];

        }

    }

}

DownImages公共函數(shù)代碼如下

function DownImages($url){
    if (!$url) return false;
    //初始化curl
    $ch = curl_init();
    //設(shè)置超時
    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,結(jié)果以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 '創(chuàng)建文件夾bookcover成功';
    } else {
        //echo '需創(chuàng)建的文件夾bookcover已經(jīng)存在';
    }
    //取出返回數(shù)據(jù)
    $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) {//這個地方設(shè)置了是否需要上傳至阿里云oss或者七牛云
        $UploadService = new appcommonserviceUpload;//這是我自己封裝的上傳類庫如需的話可以聯(lián)系我
       $refault = $UploadService::uploadFile('.'.$ref,substr($ref,1));//獲取上傳結(jié)果
       @unlink('.'.$ref);//刪除本地文件
       $src= (string)config('Index_setting_upload.bucketDomain').substr($ref,1);//返回文章的新地址
    }else{
        $src= request()->domain().$ref;//直接把本地的地址返回
    }
    return $src;
}
小結(jié),至此文章內(nèi)容遠(yuǎn)程圖片自動下載就算完了,需要注意的是正則只對后綴正常的圖片起作用。對百度圖片或者維系那公眾號的后綴就很無力了!

有啥問題或者需求歡迎聯(lián)系我?!