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


Posted in PHP onJanuary 22, 2016

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

PHP 相关文章推荐
真正的ZIP文件操作类(php)
Jul 21 PHP
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 PHP
PHP通过串口实现发送短信
Jul 08 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
PHP实现上传多图即时显示与即时删除的方法
May 09 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
Yii2框架自定义验证规则操作示例
Feb 08 PHP
PHP连接MYSQL数据库实例代码
Jan 20 #PHP
CodeIgniter配置之autoload.php自动加载用法分析
Jan 20 #PHP
Twig模板引擎用法入门教程
Jan 20 #PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 #PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 #PHP
CodeIgniter钩子用法实例详解
Jan 20 #PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 #PHP
You might like
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
Python中数字以及算数运算符的相关使用
2015/10/12 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
python requests库的使用
2021/01/06 Python
python中的插入排序的简单用法
2021/01/19 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
低碳环保口号
2014/06/12 职场文书
实习护士自荐信
2014/06/21 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
2015年公务员工作总结
2015/04/24 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书
Vue图片裁剪组件实例代码
2021/07/02 Vue.js
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript