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 相关文章推荐
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
PHP+Mysql+jQuery实现动态展示信息
Oct 08 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
php银联网页支付实现方法
Mar 04 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
深入浅析php json 格式控制
Dec 24 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 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
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
np.dot()函数的用法详解
2020/01/17 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
详解Python 中的容器 collections
2020/08/17 Python
Django如何实现防止XSS攻击
2020/10/13 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
建筑项目策划书
2014/01/13 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
淘宝活动策划方案
2014/02/06 职场文书
机械机修工岗位职责
2014/08/03 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
就业协议书
2014/09/12 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
鲁迅故居导游词
2015/02/05 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书