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 金额数字转换成英文
May 06 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
深入解析PHP内存管理之谁动了我的内存
Jun 20 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
一个php生成16位随机数的代码(两种方法)
Sep 16 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
Dec 17 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
php实现cookie加密的方法
2015/03/10 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
jquery tools系列 expose 学习
2009/09/06 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
浅谈js中的in-for循环
2016/06/28 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
python解释器安装教程的方法步骤
2020/07/02 Python
python如何写个俄罗斯方块
2020/11/06 Python
自我鉴定的范文
2013/10/03 职场文书
计算机应用专业毕业生求职信
2013/10/24 职场文书
应届生新闻编辑求职信
2013/11/19 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
《藏戏》教学反思
2014/02/11 职场文书
酒店管理求职信
2014/06/09 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
风之谷观后感
2015/06/11 职场文书
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android