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 递归效率分析
Nov 24 PHP
常见的PHP五种设计模式小结
Mar 23 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
php图片的二进制转换实现方法
Dec 15 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
php删除数组指定元素实现代码
May 03 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 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
PHP对字符串的递增运算分析
2010/08/08 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
把input初始值不写value的具体实现方法
2013/07/04 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
vue $set 给数据赋值的实例
2019/11/09 Javascript
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
Python二元算术运算常用方法解析
2020/09/15 Python
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
业务部经理岗位职责
2014/01/04 职场文书
《春晓》教学反思
2014/04/20 职场文书
班级文化建设标语
2014/06/23 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
员工教育培训协议书
2014/09/27 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
党校党性分析材料
2014/12/19 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
MySQL sql模式设置引起的问题
2022/05/15 MySQL
SQL Server中锁的用法
2022/05/20 SQL Server