-
PHP下载远程图片并保存到本地方法总结
这篇文章主要介绍了PHP下载远程图片并保存到本地方法总结的相关资料,需要的朋友可以参考下。
1.获取远程文件大小及信息的函数
- function getFileSize($url){
- $url = parse_url($url);
- if($fp = @fsockopen($url['host'],emptyempty($url['port'])?80:$url['port'],$error)){
- fputs($fp,"GET ".(emptyempty($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(<a href="http://www.phpfensi.com/download/xml.rar">http://www.phpfensi.com/download/xml.rar</a>)
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.phpfensi.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(!emptyempty($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分配内存调大,应用时用大内存服务器
出处:http://www.phpfensi.com/php/20210706/17057.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式