PHP下载远程图片的几种方法

整理一下PHP环境远程获取图片的几种方法,对PHPers应该有用!
1.获取远程文件大小及信息的函数

function getFileSize($url){
         $url = parse_url($url);
         if($fp = @fsockopen($url[’host’],empty($url[’port’])?80:$url[’port’],$error)){
                 fputs($fp,"GET ".(empty($url[’path’])?’/’:$url[’path’])." HTTP/1.1rn");
                 fputs($fp,"Host:$url[host]rnrn");
                 while(!feof($fp)){
                         $tmp = fgets($fp);
                         if(trim($tmp) == ’’){
                                 break;
                         }else if(preg_match(’/Content-Length:(.*)/si’,$tmp,$arr)){
                                 return trim($arr[1]);
                         }
                 }
                 return null;
         }else{
                 return null;
         }
}
echo getFileSize("http://www.dianpub.com/download/xml.rar")

2.图片

//记录程序开始的时间
$BeginTime=getmicrotime();

function GrabImage($url,$filename="") {
if($url==""):return false;endif;
if($filename=="") {
$ext=strrchr($url,".");
if($ext!=".gif" && $ext!=".jpg"):return false;endif;
$filename=date("dMYHis").$ext;
}
ob_start();
readfile($url);
$img = ob_get_contents();
ob_end_clean();
$size = strlen($img);
$fp2=@fopen($filename, "a");
fwrite($fp2,$img);
fclose($fp2);
return $filename;
}

$img=GrabImage("http://www.dianpub.com/images/_1978837_detector_ap100.jpg","");
if($img):echo '';else:echo "false";endif;

//记录程序运行结束的时间
$EndTime=getmicrotime();

//返回运行时间
exit($EndTime-$BeginTime);

3.全文下载图片

if(!empty($saveremoteimg))
{
$body = stripslashes($body);
$img_array = array();
preg_match_all("/(src|SRC)=["|'| ]{0,}(http://(.*).(gif|jpg|jpeg|bmp|png))/isU",$body,$img_array);
$img_array = array_unique($img_array[2]);
set_time_limit(0);
$imgUrl = $img_dir."/".strftime("%Y%m%d",time());
$imgPath = $base_dir.$imgUrl;
$milliSecond = strftime("%H%M%S",time());
if(!is_dir($imgPath)) @mkdir($imgPath,0777);
foreach($img_array as $key =>$value)
{
$value = trim($value);
$get_file = @file_get_contents($value);
$rndFileName = $imgPath."/".$milliSecond.$key.".".substr($value,-3,3);
$fileurl = $imgUrl."/".$milliSecond.$key.".".substr($value,-3,3);
if($get_file)
{
$fp = @fopen($rndFileName,"w");
@fwrite($fp,$get_file);
@fclose($fp);
}
$body = ereg_replace($value,$fileurl,$body);
}
$body = addslashes($body);
}

4.PHP远程文件下载类(支持断点续传)

1).功能:支持断点续传的下载,能计算传输率,能控制传输率

简易使用方法:

$object = new httpdownload();
$object->set_byfile($file);//服务器文件名,包括路径
$object->filename = $filename;//下载另存为的文件名
$object->download();

类文件:

< ?
      class httpdownload {
      var $data = null;
      var $data_len = 0;
      var $data_mod = 0;
      var $data_type = 0;
      var $data_section = 0; //section download
      var $sentSize=0;
      var $handler = array('auth' => null);
      var $use_resume = true;
      var $use_autoexit = false;
      var $use_auth = false;
      var $filename = null;
      var $mime = null;
      var $bufsize = 2048;
      var $seek_start = 0;
      var $seek_end = -1;
      var $totalsizeref = 0;
      var $bandwidth = 0;
      var $speed = 0;
      function initialize() {
            global $HTTP_SERVER_VARS;
            if ($this->use_auth) //use authentication {
                  if (!$this->_auth()) //no authentication {
                          header('WWW-Authenticate: Basic realm="Please enter your username and password"');
                          header('HTTP/1.0 401 Unauthorized');
                          header('status: 401 Unauthorized');
                          if ($this->use_autoexit) exit();
                          return false;
                  }
            }
            if ($this->mime == null) $this->mime = "application/octet-stream"; //default mime
            if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE'])) {
                  if (isset($HTTP_SERVER_VARS['HTTP_RANGE'])) $seek_range = substr($HTTP_SERVER_VARS['HTTP_RANGE'] , strlen('bytes='));
                  else $seek_range = substr($_SERVER['HTTP_RANGE'] , strlen('bytes='));
            $range = explode('-',$seek_range);
            if ($range[0] > 0) {
                  $this->seek_start = intval($range[0]);
            }
            if ($range[1] > 0) $this->seek_end = intval($range[1]);
            else $this->seek_end = -1;
            if (!$this->use_resume) {
                  $this->seek_start = 0;
                  //header("HTTP/1.0 404 Bad Request");
                  //header("Status: 400 Bad Request");
                  //exit;
                  //return false;
            } else {
                  $this->data_section = 1;
            }
      } else {
            $this->seek_start = 0;
            $this->seek_end = -1;
      }
      $this->sentSize=0;
      return true;
}
function header($size,$seek_start=null,$seek_end=null) {
      header('Content-type: ' . $this->mime);
      header('Content-Disposition: attachment; filename="' . $this->filename . '"');
      header('Last-Modified: ' . date('D, d M Y H:i:s GMT' , $this->data_mod));
      if ($this->data_section && $this->use_resume) {
            header("HTTP/1.0 206 Partial Content");
            header("Status: 206 Partial Content");
            header('Accept-Ranges: bytes');
            header("Content-Range: bytes $seek_start-$seek_end/$size");
            header("Content-Length: " . ($seek_end - $seek_start + 1));
      } else {
            header("Content-Length: $size");
      }
}
function download_ex($size) {
      if (!$this->initialize()) return false;
      ignore_user_abort(true);
      //Use seek end here
      if ($this->seek_start > ($size - 1)) $this->seek_start = 0;
      if ($this->seek_end < = 0) $this->seek_end = $size - 1;
      $this->header($size,$seek,$this->seek_end);
      $this->data_mod = time();
      return true;
}
function download() {
      if (!$this->initialize()) return false;
      try {
            error_log("begin downloadn", 3,"/usr/local/www/apache22/LOGS/apache22_php.err");
            $seek = $this->seek_start;
            $speed = $this->speed;
            $bufsize = $this->bufsize;
            $packet = 1;
            //do some clean up
            @ob_end_clean();
            $old_status = ignore_user_abort(true);
            @set_time_limit(0);
            $this->bandwidth = 0;
            $size = $this->data_len;
            if ($this->data_type == 0) //download from a file {
                  $size = filesize($this->data);
                  if ($seek > ($size - 1)) $seek = 0;
                  if ($this->filename == null) $this->filename = basename($this->data);
                  $res = fopen($this->data,'rb');
                  if ($seek) fseek($res , $seek);
                  if ($this->seek_end < $seek) $this->seek_end = $size - 1;
                  $this->header($size,$seek,$this->seek_end); //always use the last seek
                  $size = $this->seek_end - $seek + 1;
                  while (!(connection_aborted() || connection_status() == 1) && $size > 0) {
                        if ($size < $bufsize) {
                              echo fread($res , $size);
                              $this->bandwidth += $size;
                              $this->sentSize+=$size;
                        } else {
                        echo fread($res , $bufsize);
                        $this->bandwidth += $bufsize;
                        $this->sentSize+=$bufsize;
                  }
                  $size -= $bufsize;
                  flush();
                  if ($speed > 0 && ($this->bandwidth > $speed*$packet*1024)) {
                        sleep(1);
                        $packet++;
                  }
            }
            fclose($res);
      }
      elseif ($this->data_type == 1) //download from a string
      {
            if ($seek > ($size - 1)) $seek = 0;
            if ($this->seek_end < $seek) $this->seek_end = $this->data_len - 1;
            $this->data = substr($this->data , $seek , $this->seek_end - $seek + 1);
            if ($this->filename == null) $this->filename = time();
            $size = strlen($this->data);
            $this->header($this->data_len,$seek,$this->seek_end);
            while (!connection_aborted() && $size > 0) {
                  if ($size < $bufsize) {
                        $this->bandwidth += $size;
                        $this->sentSize+=$size;
                  } else {
                        $this->bandwidth += $bufsize;
                        $this->sentSize+=$bufsize;
                  }
                  echo substr($this->data , 0 , $bufsize);
                  $this->data = substr($this->data , $bufsize);
                  $size -= $bufsize;
                  flush();
                  if ($speed > 0 && ($this->bandwidth > $speed*$packet*1024)) {
                        sleep(1);
                        $packet++;
                  }
            }
      } else if ($this->data_type == 2) {
            //just send a redirect header
            header('location: ' . $this->data);
      }
      if($this->totalsizeref==$this->sentSize )error_log("end downloadn", 3,"/usr/local/www/apache22/LOGS/apache22_php.err");
      else error_log("download is canceledn", 3,"/usr/local/www/apache22/LOGS/apache22_php.err");
      if ($this->use_autoexit) exit();
      //restore old status
      ignore_user_abort($old_status);
      set_time_limit(ini_get("max_execution_time"));
}
catch(Exception $e) {
      error_log("cancel downloadn".$e, 3,"/usr/local/www/apache22/LOGS/apache22_php.err");
}
      return true;
}
function set_byfile($dir) {
      if (is_readable($dir) && is_file($dir)) {
            $this->data_len = 0;
            $this->data = $dir;
            $this->data_type = 0;
            $this->data_mod = filemtime($dir);
            $this->totalsizeref = filesize($dir);
            return true;
      } else return false;
}
function set_bydata($data) {
      if ($data == '') return false;
            $this->data = $data;
            $this->data_len = strlen($data);
            $this->data_type = 1;
            $this->data_mod = time();
            return true;
}
function set_byurl($data) {
      $this->data = $data;
      $this->data_len = 0;
      $this->data_type = 2;
      return true;
}
function set_lastmodtime($time) {
      $time = intval($time);
      if ($time < = 0) $time = time();
      $this->data_mod = $time;
}
function _auth() {
      if (!isset($_SERVER['PHP_AUTH_USER'])) return false;
      if (isset($this->handler['auth']) && function_exists($this->handler['auth'])) {
            return $this->handler['auth']('auth' , $_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
      } else return true; //you must use a handler
      }
}
?>

5. php 使用GD库下载远程图片

< ?php  
$imgname = "http://imgdujia.kuxun.cn/newpic/929/812929/4.jpg";  
$src_im = imagecreatefromjpeg($imgname);  
$srcW = ImageSX($src_im);                                                       //获得图像的宽  
$srcH = ImageSY($src_im);                                                       //获得图像的高  

$dst_im = ImageCreateTrueColor($srcW,$srcH);                    //创建新的图像对象  

imagecopy($dst_im, $src_im, 0, 0, 0, 0, $srcW, $srcH);  
imagejpeg($dst_im, "newpic.jpg");                                               //创建缩略图文件  

echo "";  
?>
< ?php
header("Content-type: image/png");
$im = imagecreatefromjpeg("http://postimg.mop.com/200602/02/74/122374/200602022335325121.JPG");
$white = imagecolorallocate($im, 0xF9, 0xD7, 0xCD);
imagefill($im, 0, 0,$white);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,   "A Simple Text String", $text_color);
imagepng($im);
imagedestroy($im);
?>

注意这个要把PHP分配内存调大,应用时用大内存服务器。
本转发自http://hi.baidu.com/dmkj2008/blog/item/33aa71ec0006ee312797914b.html

思章老师

认准了方向,就要勇敢地走下去,十年磨一剑,我相信,只要坚持,一切都有可能。

相关日志

  1. 没有图片

    2010.08.30

    WordPress日志评论手机飞信提醒插件

    ommnet Fetion Alert 是由…

  2. 没有图片

    2011.01.24

    WordPress 3.1 RC3 发布

    WordPress 近来更新的动作不小,从R…

  3. 没有图片

    2010.05.10

    收藏群里小清同学针对寒三友的诗句

    小清同学在群里发的她和她师傅一起写的诗,收藏…

  4. 没有图片

    2010.05.13

    Microsoft Office 2003 SP3五合一简体中文版

    Microsoft Office 2003 …

  5. 没有图片

    2010.05.08

    Google 10大免费关键字分析工具

    要 钱的互联网产品我没有多大的兴趣,因为凡是…

  6. 2015.09.02

    Adobe CC 2015 全线产品及注册激活补丁

    日前,Adobe旗下设计套件Adobe Cr…

评论

  1. 天天天蓝 2010.05.30 1:52下午

    PHP做前端开发还是很好的,找个时间好好学习下

    • 天天天蓝 2010.05.30 3:10下午

      千百度,贵站链接已加,欢迎互访,呵呵

      • 小百度 2010.05.30 6:11下午

        OK,链接我也已经添加你的了。以后常交流!共同进步!

  2. 沉冰浮水 2010.05.29 12:55下午

    呵。。不管小百度还是千百度都不够唯一啊。。呵。。
    又忘了验证了。。弄上边吧。。

    • 小百度 2010.05.30 6:07下午

      哈哈,小百度也不唯一?没事,我做第一就行了。