PHP实现下载远程图片保存到本地的方法


Posted in PHP onJune 19, 2017

在使用 PHP 做简单的爬虫的时候,我们经常会遇到需要下载远程图片的需求,所以下面来简单实现这个需求。

1.使用 curl

比如我们有下面这两张图片:

$images = [
  'https://dn-laravist.qbox.me/2015-09-22_00-17-06j.png',
  'https://dn-laravist.qbox.me/2015-09-23_00-58-03j.png'
];

第一步,我们可以直接来使用最简单的代码实现:

function download($url, $path = 'images/')
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  $file = curl_exec($ch);
  curl_close($ch);
  $filename = pathinfo($url, PATHINFO_BASENAME);
  $resource = fopen($path . $filename, 'a');
  fwrite($resource, $file);
  fclose($resource);
}

那在下载远程图片的时候就可以这样:

foreach ( $images as $url ) {
  download($url);
}

2.封装一个类

缕清思路之后,我们可以将这个基本的功能封装到一个类中:

class Spider {

  public function downloadImage($url, $path = 'images/')
  {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    $file = curl_exec($ch);
    curl_close($ch);
    $filename = pathinfo($url, PATHINFO_BASENAME);
    $resource = fopen($path . $filename, 'a');
    fwrite($resource, $file);
    fclose($resource);
  }
}

在者,我们还可以这样稍微优化一下:

public function downloadImage($url, $path='images/')
  {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    $file = curl_exec($ch);
    curl_close($ch);

    $this->saveAsImage($url, $file, $path);
  }

  private function saveAsImage($url, $file, $path)
  {
    $filename = pathinfo($url, PATHINFO_BASENAME);
    $resource = fopen($path . $filename, 'a');
    fwrite($resource, $file);
    fclose($resource);
  }

封装成类之后,我们可以这样调用代码来下载图片:

$spider = new Spider();

foreach ( $images as $url ) {
  $spider->downloadImage($url);
}

这样,对付基本的远程图片下载就OK了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
php中选择什么接口(mysql、mysqli)访问mysql
Feb 06 PHP
PHP中的函数-- foreach()的用法详解
Jun 24 PHP
php中chdir()函数用法实例
Nov 13 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
详解php中反射的应用
Mar 15 PHP
php中namespace及use用法分析
Dec 06 PHP
php格式化时间戳
Dec 17 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 #PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 #PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 #PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 #PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 #PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 #PHP
Laravel中log无法写入问题的解决
Jun 17 #PHP
You might like
PHP中的正规表达式(一)
2006/10/09 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
javascript实现下雨效果
2017/03/27 Javascript
详解JS数值Number类型
2018/02/07 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
在Django中使用Sitemap的方法讲解
2015/07/22 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
单身联谊活动方案
2014/01/29 职场文书
幼儿园门卫制度
2014/01/29 职场文书
大学生励志演讲稿
2014/04/25 职场文书
公司年终奖分配方案
2014/06/16 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
初中差生评语
2014/12/29 职场文书
导游词怎么写
2015/02/04 职场文书
结婚主持人致辞
2015/07/28 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
Python初学者必备的文件读写指南
2021/06/23 Python