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 相关文章推荐
一个查看session内容的函数
Oct 09 PHP
一家之言的经验之谈php+mysql扎实个人基本功
Mar 27 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
PHP如何抛出异常处理错误
Mar 02 PHP
php中取得文件的后缀名?
Feb 20 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
php生成图片验证码
Jun 09 PHP
php析构函数的简单使用说明
Aug 24 PHP
Adnroid 微信内置浏览器清除缓存
Jul 11 PHP
PHP缩略图生成和图片水印制作
Jan 07 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
Use Word to Search for Files
2007/06/15 Javascript
js对象的比较
2011/02/26 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
详解python并发获取snmp信息及性能测试
2017/03/27 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
python画微信表情符的实例代码
2019/10/09 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
.net开发工程师面试题
2014/02/25 面试题
财务工作者先进事迹材料
2014/01/17 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
Nginx报404错误的详细解决方法
2022/07/23 Servers