php中使用gd库实现下载网页中所有图片


Posted in PHP onMay 12, 2015

在前期的php教程就讲了php gd库可以实现远程图片的下载,但是那只是下载了一张图片,原理是一样的,要想下载一个网页的所有图片只要使用正则表达式进行判断,找出所有的图片url就可以进行循环下载了,我特地参照网络资源编写了gd库图片下载类!
php代码如下:

<?php
header("Content-type:text/html ; charset=utf-8");
if (!empty($_POST['submit'])){
 $url = $_POST['url'];
 //为了获取相对路径的图片所做的操作
 $url_fields = parse_url($url);
 $main_url = $url_fields['host'];
 $base_url = substr($url,0,strrpos($url, '/')+1);
 //获取网页内容
 //设置代理服务器
 $opts = array('http'=>array('request_fulluri'=>true));
 $context = stream_context_create($opts);
 $content = file_get_contents($url,false,$context);
 //匹配img标签,将所有匹配字符串保存到数组$matches
 $reg = "/<img.*?src=\"(.*?)\".*?>/i";
 preg_match_all($reg, $content, $matches);
 $count = count($matches[0]);
 for ($i=0; $i<$count; $i++){
 /*将所有图片的url转换为小写
  *$matches[1][$i] = strtolower($matches[1][$i]);
 */
 //如果图片为相对路径就转化为全路径
 if (!strpos('a'.$matches[1][$i], 'http')){
  //因为'/'是第0个位置
  if (strpos('a'.$matches[1][$i], '/')){
  $matches[1][$i] = 'http://'.$main_url.$matches[1][$i];
  }else{
  $matches[1][$i] = $base_url.$matches[1][$i];
  }
 }
 }
 //过滤重复的图片
 $img_arr = array_unique($matches[1]);
 //实例化图片下载类
 $getImg = new DownImage();
 $url_count = count($img_arr);
 for ($i=0; $i<$url_count; $i++){
 $getImg->source = $img_arr[$i];
 $getImg->save_address = './pic/';
 $file = $getImg->download();
 }
 echo "下载完成!哈哈,简单吧!";
}
class DownImage{
 public $source;//远程图片URL
 public $save_address;//保存本地地址
 public $set_extension; //设置图片扩展名
 public $quality; //图片的质量(0~100,100最佳,默认75左右)
 //下载方法(选用GD库图片下载)
 public function download(){
 //获取远程图片信息
 $info = @getimagesize($this->source);
 //获取图片扩展名
 $mime = $info['mime'];
 $type = substr(strrchr($mime, '/'), 1);
 //不同的图片类型选择不同的图片生成和保存函数
 switch($type){
  case 'jpeg':
  $img_create_func = 'imagecreatefromjpeg';
  $img_save_func = 'imagejpeg';
  $new_img_ext = 'jpg';
  $image_quality = isset($this->quality) ? $this->quality : 100;
  break;
  case 'png':
  $img_create_func = 'imagecreatefrompng';
  $img_save_func = 'imagepng';
  $new_img_ext = 'png';
  break;
  case 'bmp':
  $img_create_func = 'imagecreatefrombmp';
  $img_save_func = 'imagebmp';
  $new_img_ext = 'bmp';
  break;
  case 'gif':
  $img_create_func = 'imagecreatefromgif';
  $img_save_func = 'imagegif';
  $new_img_ext = 'gif';
  break;
  case 'vnd.wap.wbmp':
  $img_create_func = 'imagecreatefromwbmp';
  $img_save_func = 'imagewbmp';
  $new_img_ext = 'bmp';
  break;
  case 'xbm':
  $img_create_func = 'imagecreatefromxbm';
  $img_save_func = 'imagexbm';
  $new_img_ext = 'xbm';
  break;
  default:
  $img_create_func = 'imagecreatefromjpeg';
  $img_save_func = 'imagejpeg';
  $new_img_ext = 'jpg';
 }
 //根据是否设置扩展名来合成本地文件名
 if (isset($this->set_extension)){
  $ext = strrchr($this->source,".");
  $strlen = strlen($ext);
  $newname = basename(substr($this->source,0,-$strlen)).'.'.$new_img_ext;
 }else{
  $newname = basename($this->source);
 }
 
 //生成本地文件路径
 $save_address = $this->save_address.$newname;
 $img = @$img_create_func($this->source);
 if (isset($image_quality)){
  $save_img = @$img_save_func($img,$save_address,$image_quality);
 }else{
  $save_img = @$img_save_func($img,$save_address);
 }
 return $save_img; 
 }
}
?>
<form method="POST" action="">
远程url地址:<input type="text" name="url" size=30 />
<input type="submit" name="submit" value="下载该页面所有图片" />
</form>

运行结果如图:

php中使用gd库实现下载网页中所有图片

PHP 相关文章推荐
PHP的博客ping服务代码
Feb 04 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
Apr 01 PHP
php获得文件大小和文件创建时间的方法
Mar 13 PHP
php内嵌函数用法实例
Mar 20 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
PHP与SQL语句常用大全
Dec 10 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
May 23 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 PHP
php中使用gd库实现远程图片下载实例
May 12 #PHP
PHP输入输出流学习笔记
May 12 #PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 #PHP
php中get_defined_constants函数用法实例分析
May 12 #PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
May 12 #PHP
php遍历类中包含的所有元素的方法
May 12 #PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 #PHP
You might like
用PHP查询域名状态whois的类
2006/11/25 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
PHP print类函数使用总结
2010/06/25 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
python实现Flappy Bird源码
2018/12/24 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
python中if嵌套命令实例讲解
2021/02/25 Python
顺丰快递Java软件工程师面试题
2015/07/31 面试题
商务日语专业毕业生求职信
2013/10/26 职场文书
合伙经营协议书范本
2014/04/18 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
党性分析材料格式
2014/12/19 职场文书
学生评语集锦
2015/01/04 职场文书
红色经典观后感
2015/06/18 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
公司年会主持词范文!
2019/05/07 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL