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.09.12

    老师,您还记得什么是育人吗?

    前天是教师节,和平常一样,平平淡淡地过,当然…

  2. 没有图片

    2010.05.04

    千百度正式上线 欢迎大家围观!

    经过一番努力和准备,千百度个人博客强势上线,…

  3. 没有图片

    2010.04.25

    中国博客联盟全新上线,欢迎博主加入!

    中国博客联盟主站在界面和功能上又进行了一次全…

  4. 没有图片

    2011.01.13

    开源免费的Flv播放器

    从飞晏博客那看到一款Flv播放器的介绍,转到…

  5. 没有图片

    2011.04.21

    Windows XP死亡倒计时小工具

    Windows XP、Internet Ex…

  6. 没有图片

    2010.09.15

    悄悄话与家庭教育的辩证关系

    什么时候,我们的孩子能够主动和你讲他的悄悄话…

评论

  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下午

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

About

马拉松运动员,沉迷于跑步;关注科技前沿,关注互联网!与跑者、程序员、设计师为伍,一起跑步健身,一起编写程序,为自由而战!