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分配内存调大,应用时用大内存服务器