• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP下载远程图片并保存到本地方法总结_php实例

php 搞代码 3年前 (2022-01-25) 11次浏览 已收录 0个评论

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 class="prettyprint linenums">

‘;else:echo%20″false”;endif;//记录程序运行结束的时间$EndTime=getmicrotime();//返回运行时间exit($EndTime-$BeginTime);

3.全文下载图片

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

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

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

简易使用方法:

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

类文件:

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

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

<?php%20$imgname%20=%20"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分配内存调大,应用时用大内存服务器


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP下载远程图片并保存到本地方法总结_php实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址