PHP下载远程图片并保存到本地方法总结
1.获取远程文件大小及信息的函数
functiongetFileSize($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; }elseif(preg_match('/Content-Length:(.*)/si',$tmp,$arr)){ returntrim($arr[1]); } } returnnull; }else{ returnnull; } } echogetFileSize(http://www.dianpub.com/download/xml.rar)
2.图片
//记录程序开始的时间 $BeginTime=getmicrotime(); functionGrabImage($url,$filename=""){ if($url==""):returnfalse;endif; if($filename==""){ $ext=strrchr($url,"."); if($ext!=".gif"&&$ext!=".jpg"):returnfalse;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><imgsrc="'.$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_arrayas$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=newhttpdownload(); $object->set_byfile($file);//服务器文件名,包括路径 $object->filename=$filename;//下载另存为的文件名 $object->download();
类文件:
<? classhttpdownload{ var$data=null; var$data_len=0; var$data_mod=0; var$data_type=0; var$data_section=0;//sectiondownload 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; functioninitialize(){ global$HTTP_SERVER_VARS; if($this->use_auth)//useauthentication{ if(!$this->_auth())//noauthentication{ header('WWW-Authenticate:Basicrealm="Pleaseenteryourusernameandpassword"'); header('HTTP/1.0401Unauthorized'); header('status:401Unauthorized'); if($this->use_autoexit)exit(); returnfalse; } } if($this->mime==null)$this->mime="application/octet-stream";//defaultmime 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.0404BadRequest"); //header("Status:400BadRequest"); //exit; //returnfalse; }else{ $this->data_section=1; } }else{ $this->seek_start=0; $this->seek_end=-1; } $this->sentSize=0; returntrue; } functionheader($size,$seek_start=null,$seek_end=null){ header('Content-type:'.$this->mime); header('Content-Disposition:attachment;filename="'.$this->filename.'"'); header('Last-Modified:'.date('D,dMYH:i:s\G\M\T',$this->data_mod)); if($this->data_section&&$this->use_resume){ header("HTTP/1.0206PartialContent"); header("Status:206PartialContent"); 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"); } } functiondownload_ex($size){ if(!$this->initialize())returnfalse; ignore_user_abort(true); //Useseekendhere 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(); returntrue; } functiondownload(){ if(!$this->initialize())returnfalse; try{ error_log("begindownload\n",3,"/usr/local/www/apache22/LOGS/apache22_php.err"); $seek=$this->seek_start; $speed=$this->speed; $bufsize=$this->bufsize; $packet=1; //dosomecleanup @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)//downloadfromafile{ $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);//alwaysusethelastseek $size=$this->seek_end-$seek+1; while(!(connection_aborted()||connection_status()==1)&&$size>0){ if($size<$bufsize){ echofread($res,$size); $this->bandwidth+=$size; $this->sentSize+=$size; }else{ echofread($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)//downloadfromastring { 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; } echosubstr($this->data,0,$bufsize); $this->data=substr($this->data,$bufsize); $size-=$bufsize; flush(); if($speed>0&&($this->bandwidth>$speed*$packet*1024)){ sleep(1); $packet++; } } }elseif($this->data_type==2){ //justsendaredirectheader header('location:'.$this->data); } if($this->totalsizeref==$this->sentSize)error_log("enddownload\n",3,"/usr/local/www/apache22/LOGS/apache22_php.err"); elseerror_log("downloadiscanceled\n",3,"/usr/local/www/apache22/LOGS/apache22_php.err"); if($this->use_autoexit)exit(); //restoreoldstatus ignore_user_abort($old_status); set_time_limit(ini_get("max_execution_time")); } catch(Exception$e){ error_log("canceldownload\n".$e,3,"/usr/local/www/apache22/LOGS/apache22_php.err"); } returntrue; } functionset_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); returntrue; }elsereturnfalse; } functionset_bydata($data){ if($data=='')returnfalse; $this->data=$data; $this->data_len=strlen($data); $this->data_type=1; $this->data_mod=time(); returntrue; } functionset_byurl($data){ $this->data=$data; $this->data_len=0; $this->data_type=2; returntrue; } functionset_lastmodtime($time){ $time=intval($time); if($time<=0)$time=time(); $this->data_mod=$time; } function_auth(){ if(!isset($_SERVER['PHP_AUTH_USER']))returnfalse; if(isset($this->handler['auth'])&&function_exists($this->handler['auth'])){ return$this->handler['auth']('auth',$_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']); }elsereturntrue;//youmustuseahandler } } ?>
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"<imgsrc="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); $text_color=imagecolorallocate($im,233,14,91); imagestring($im,1,5,5,"ASimpleTextString",$text_color); imagepng($im); imagedestroy($im); ?>
注意这个要把PHP分配内存调大,应用时用大内存服务器