php将远程图片保存到本地服务器的实现代码


Posted in PHP onAugust 03, 2015

php如何将远程图片本地化,本文分享了实现代码

<?php 
//站点根目录 
$cfg_basedir = dirname(__FILE__); 
//停建目录属性 
$cfg_dir_purview ='0755'; 
 /*Get请求远程内容函数*/ 
 $cookie_file = dirname(__FILE__).'/cookie.txt'; //COOKIE存放地址 
  function pget($url,$ref=false,$head=false){ 
  $curl = curl_init(); // 启动一个CURL会话 
  curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址       
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 
  curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 
  if($ref){ curl_setopt($curl, CURLOPT_REFERER, $ref);//带来的Referer 
  }else{ 
  curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer 
  } 
  curl_setopt($curl, CURLOPT_HTTPGET, 1); // 发送一个常规的Post请求 
  curl_setopt($curl, CURLOPT_COOKIEJAR, $GLOBALS['cookie_file']); // 存放Cookie信息的文件名称 
  curl_setopt($curl, CURLOPT_COOKIEFILE,$GLOBALS ['cookie_file']); // 读取上面所储存的Cookie信息 
  curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 
  curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 
  $tmpInfo = curl_exec($curl); // 执行操作 
  if (curl_errno($curl)) { 
 echo 'Errno'.curl_error($curl); 
  } 
   if($head){ $data['head']=curl_getinfo($curl);} 
  curl_close($curl); // 关键CURL会话 
  $data['data']=$tmpInfo; 
  return $data; // 返回数据 
} 
 
 
/** 
 * 创建所有目录 
 * 
 * @param   string $truepath 真实地址 
 * @param   string $mmode  模式 
 * @return  bool 
 */ 
if ( ! function_exists('MkdirAll')) 
{ 
  function MkdirAll($truepath) 
  { global $cfg_dir_purview; 
      if(!file_exists($truepath)) 
      { 
        mkdir($truepath, $cfg_dir_purview); 
        chmod($truepath, $cfg_dir_purview); 
        return true; 
      } 
      else 
      { 
        return true; 
      } 
  } 
} 
  /** 
 * 获得文章body里的外部资源 
 * 
 * @access  public 
 * @param   string $body 文档内容 
 * @return  string 
 */ 
function GetCurContent($body) 
{ 
  global $cfg_multi_site,$cfg_basehost,$cfg_basedir,$cfg_image_dir,$arcID,$cuserLogin,$dsql; 
  $cfg_uploaddir = '/c'; 
  $basehost = "http://".$_SERVER["HTTP_HOST"]; 
     
  $img_array = array(); 
  preg_match_all("/src=[\"|'|\s]{0,}(http:\/\/([^>]*)\.(gif|jpg|png))/isU",$body,$img_array); 
   
  $img_array = array_unique($img_array[1]); 
  $imgUrl = $cfg_uploaddir.'/'.date("ymd", time()); 
  $imgPath = $cfg_basedir.$imgUrl; 
  if(!is_dir($imgPath.'/')) 
  { 
    MkdirAll($imgPath, $GLOBALS['cfg_dir_purview']); 
    CloseFtp(); 
  } 
  $milliSecond = date('His',time()); 
  foreach($img_array as $key=>$value) 
  {  
    if(preg_match("#".$basehost."#i", $value)) 
    { 
      continue; 
    } 
    if(preg_match("#".$basehost."#i", $value)) 
    { 
      continue; 
    } 
    if(!preg_match("#^http:\/\/#i", $value)) 
    { 
      continue; 
    } 
    
    $http=pget($value,'$value',true); 
    $itype=($http['head']['content_type']); 
    if(!preg_match("#\.(jpg|gif|png)#i", $itype)) 
    { 
      if($itype=='image/gif') 
      { 
        $itype = ".gif"; 
      } 
      else if($itype=='image/png') 
      { 
        $itype = ".png"; 
      } 
      else 
      { 
        $itype = '.jpg'; 
      } 
    } 
    $milliSecondN = rand(1000,9999).rand(1000,9999); 
    $value = trim($value); 
    $rndFileName = $imgPath.'/'.$milliSecondN.'-'.$key.$itype; 
    $fileurl = $imgUrl.'/'.$milliSecondN.'-'.$key.$itype; 
 
    $tp = fopen($rndFileName, 'wb'); 
    fwrite($tp, $http['data']); 
    fclose($tp); 
     
    if(file_exists($cfg_basedir.$fileurl)) 
    { 
      $info = ''; 
      $imginfos = GetImageSize($rndFileName, $info); 
      $fsize = filesize($rndFileName); 
      $body = str_replace($value, $fileurl, $body); 
  
    } 
  } 
  return $body; 
} 
 
//调用方式 
echo GetCurContent($body);

以上就是实现远程图片本地化的全部代码,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP的历史和优缺点
Oct 09 PHP
用PHP发电子邮件
Oct 09 PHP
php 数组的合并、拆分、区别取值函数集
Feb 15 PHP
在Windows系统上安装PHP运行环境文字教程
Jul 19 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
用php的ob_start来生成静态页面的方法分析
Mar 09 PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
Web程序工作原理详解
Dec 25 PHP
PHP7 新增常量
Mar 09 PHP
php基于session实现数据库交互的类实例
Aug 03 #PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 #PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 #PHP
UTF-8正则表达式如何匹配汉字
Aug 03 #PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 #PHP
php中ob函数缓冲机制深入理解
Aug 03 #PHP
如何利用http协议发布博客园博文评论
Aug 03 #PHP
You might like
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
自己动手开发jQuery插件教程
2011/08/25 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
详解python时间模块中的datetime模块
2016/01/13 Python
Python 字典与字符串的互转实例
2017/01/13 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
善意的谎言事例
2014/02/15 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
岁月神偷观后感
2015/06/11 职场文书
老乡会致辞
2015/07/28 职场文书
消防安全培训工作总结
2015/10/23 职场文书
乔迁新居祝福语
2019/11/04 职场文书