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 相关文章推荐
PHP 和 MySQL 基础教程(三)
Oct 09 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
用PHP将数据导入到Foxmail的实现代码
Sep 05 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
destoon找回管理员密码的方法
Jun 21 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
Laravel 5.3 学习笔记之 错误&日志
Aug 28 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
实例说明js脚本语言和php脚本语言的区别
Apr 04 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 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的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
使用Python读取大文件的方法
2018/02/11 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
python读取xlsx的方法
2018/12/25 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
python计算二维矩形IOU实例
2020/01/18 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
幼儿园数学教学反思
2014/02/02 职场文书
2014全国两会心得体会
2014/03/17 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
论文指导教师评语
2014/04/28 职场文书
办理护照工作证明
2014/10/10 职场文书
永不妥协观后感
2015/06/10 职场文书
感谢信
2019/04/11 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
Minikube搭建Kubernetes集群
2022/03/31 Servers