php 下载远程图片 的几种方法
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);
$text_color = imagecolorallocate($im, 233, 14,
91);
imagestring($im, 1, 5, 5, "A Simple Text String",
$text_color);
imagepng($im);
imagedestroy($im);
?>
注意这个要把PHP分配内存调大,应用时用大内存服务器
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。