用php實作遠端圖片擷取到本地的方法

PHPz
發布: 2023-03-07 09:28:01
原創
2332 人瀏覽過

今天寫了一個這個功能, 拿出來跟朋友一起分享,可以獲取遠端圖片並保存到本地,其實大家可以參考很多php管理系統都有這個功能。

第一步. 先從文章中把所有 用正規摳出來.

程式碼如下:

$message //文章内容 
//正则(这个还不是) 
$reg = "/<img[^>]*src=\"(http:\/\/(.+)\/(.+)\.(jpg|gif|bmp|bnp))\"/isU"; 
//把抠出来的 img 地址存放到 $img_array 变量中 
preg_match_all($reg, $message, $img_array, PREG_PATTERN_ORDER); 
//过滤重复的图片 
$img_array = array_unique($img_array[1]);
登入後複製

第二步. 把$img_array 陣列循環一下. 做圖片儲存和文章位置替換

程式碼如下:

foreach ($img_array as $img){ 
//判断是否是自己网站上的 图片 
if(&#39;xxx.com&#39; != get_domain($img)){// 如果这个图片不是自己服务器上的 
//读取图片文件 
$Gimg = new GetImage(); 
$Gimg->source = $img; 
$Gimg->save_to = &#39;./data/temp/&#39;; 
$FILE = $Gimg->download(); //图片移动到本地 
//保存到相册 得到图片保存的位置 
$img_path = pic_save($FILE,0,&#39;&#39;); 
//文本路径替换 
$message = str_replace($img, $img_path, $message); 
} 
}
登入後複製

....這時候$message 裡面已經圖片已經替換為自己伺服器本地的地址,並且圖片也保存到自己的伺服器上.

代碼如下:

//下面一个函数 和 类是从网络上找的. 
//从url中获得域名 
function get_domain($url){ 
$pattern = "/[\w-]+\.(com|net|org|gov|cc|biz|info|cn)(\.(cn|hk))*/"; 
preg_match($pattern, $url, $matches); 
if(count($matches) > 0) { 
return $matches[0]; 
}else{ 
$rs = parse_url($url); 
$main_url = $rs["host"]; 
if(!strcmp(long2ip(sprintf("%u",ip2long($main_url))),$main_url)) { 
return $main_url; 
}else{ 
$arr = explode(".",$main_url); 
$count=count($arr); 
$endArr = array("com","net","org","3322");//com.cn net.cn 等情况 
if (in_array($arr[$count-2],$endArr)){ 
$domain = $arr[$count-3].".".$arr[$count-2].".".$arr[$count-1]; 
}else{ 
$domain = $arr[$count-2].".".$arr[$count-1]; 
} 
return $domain; 
}// end if(!strcmp...) 
}// end if(count...) 
}// end function 
// 从远程吧图片载到服务器本地 的 类 
class GetImage { 
var $source; 
var $save_to; 
var $quality; 
function download($method = &#39;curl&#39;) { 
$info = @GetImageSize($this->source); 
$mime = $info[&#39;mime&#39;]; 
// What sort of image? 
$type = substr(strrchr($mime, &#39;/&#39;), 1); 
switch ($type){ 
case &#39;jpeg&#39;: 
$image_create_func = &#39;ImageCreateFromJPEG&#39;; 
$image_save_func = &#39;ImageJPEG&#39;; 
$new_image_ext = &#39;jpg&#39;; 
// Best Quality: 100 
$quality = isSet($this->quality) ? $this->quality : 100; 
break; 
case &#39;png&#39;: 
$image_create_func = &#39;ImageCreateFromPNG&#39;; 
$image_save_func = &#39;ImagePNG&#39;; 
$new_image_ext = &#39;png&#39;; 
// Compression Level: from 0 (no compression) to 9 
$quality = isSet($this->quality) ? $this->quality : 0; 
break; 
case &#39;bmp&#39;: 
$image_create_func = &#39;ImageCreateFromBMP&#39;; 
$image_save_func = &#39;ImageBMP&#39;; 
$new_image_ext = &#39;bmp&#39;; 
break; 
case &#39;gif&#39;: 
$image_create_func = &#39;ImageCreateFromGIF&#39;; 
$image_save_func = &#39;ImageGIF&#39;; 
$new_image_ext = &#39;gif&#39;; 
break; 
case &#39;vnd.wap.wbmp&#39;: 
$image_create_func = &#39;ImageCreateFromWBMP&#39;; 
$image_save_func = &#39;ImageWBMP&#39;; 
$new_image_ext = &#39;bmp&#39;; 
break; 
case &#39;xbm&#39;: 
$image_create_func = &#39;ImageCreateFromXBM&#39;; 
$image_save_func = &#39;ImageXBM&#39;; 
$new_image_ext = &#39;xbm&#39;; 
break; 
default: 
$image_create_func = &#39;ImageCreateFromJPEG&#39;; 
$image_save_func = &#39;ImageJPEG&#39;; 
$new_image_ext = &#39;jpg&#39;; 
} 
if(isSet($this->set_extension)){ 
$ext = strrchr($this->source, "."); 
$strlen = strlen($ext); 
$new_name = basename(substr($this->source, 0, -$strlen)).&#39;.&#39;.$new_image_ext; 
}else{ 
$new_name = basename($this->source); 
} 
$save_to = $this->save_to."/blog_insert_temp_".time().mt_rand(1,99).".".$new_image_ext; 
//输出对象 组成跟$_FILE变量一样 得到后自己和平常图片上传处理一样了 
$img_info[&#39;name&#39;] = basename($this->source); 
$img_info[&#39;type&#39;] = $mime; 
$img_info[&#39;size&#39;] = 1000; 
$img_info[&#39;tmp_name&#39;] = $save_to; 
$img_info[&#39;error&#39;] = 0; 
if($method == &#39;curl&#39;){ 
$save_image = $this->LoadImageCURL($save_to); 
}elseif($method == &#39;gd&#39;){ 
$img = $image_create_func($this->source); 
if(isSet($quality)){ 
$save_image = $image_save_func($img, $save_to, $quality); 
}else{ 
$save_image = $image_save_func($img, $save_to); 
} 
} 
return $img_info; 
} 
function LoadImageCURL($save_to){ 
$ch = curl_init($this->source); 
$fp = fopen($save_to, "wb"); 
// set URL and other appropriate options 
$options = array(CURLOPT_FILE => $fp, 
CURLOPT_HEADER => 0, 
CURLOPT_FOLLOWLOCATION => 1, 
CURLOPT_TIMEOUT => 60); // 1 minute timeout (should be enough) 
curl_setopt_array($ch, $options); 
curl_exec($ch); 
curl_close($ch); 
fclose($fp); 
} 
}
登入後複製

以上是用php實作遠端圖片擷取到本地的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板