现在的位置: 首页 > 综合 > 正文

php程序获取远程图片进行下载到本地方法的总结

2013年10月16日 ⁄ 综合 ⁄ 共 10636字 ⁄ 字号 评论关闭

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.1\r\n"); 

                 fputs($fp,"Host:$url[host]\r\n\r\n"); 

                 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 '<pre><img src="'.$img.'"></pre>';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 \G\M\T' , $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 download\n", 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 download\n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err"); 

      else error_log("download is canceled\n", 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 download\n".$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 "<img src="newpic.jpg" mce_src="newpic.jpg"></img>";  

?>

 

<?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);

抱歉!评论已关闭.