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下把数组保存为文件格式的实例应用
Feb 08 PHP
PHP详解ASCII码对照表与字符转换
Dec 05 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
PHP中文分词 自动获取关键词介绍
Nov 13 PHP
php Session存储到Redis的方法
Nov 04 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
php使用str_replace实现输入框回车替换br的方法
Nov 24 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 10 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 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类
2006/11/25 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
基于PHP制作验证码
2016/10/12 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
js压缩利器
2007/02/20 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
什么是makefile? 如何编写makefile?
2012/08/08 面试题
客服主管岗位职责
2013/12/13 职场文书
优秀村官事迹材料
2014/01/10 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
班级旅游计划书
2014/05/03 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
React四级菜单的实现
2022/04/08 Javascript
利用Python实时获取steam特惠游戏数据
2022/06/25 Python