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将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
使用Linux五年积累的一些经验技巧
Jun 20 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
Oct 26 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
PHP模糊查询的实现方法(推荐)
Sep 06 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
如何理解PHP核心特性命名空间
May 28 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
JavaScript实现单例模式实例分享
2017/12/22 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python调用C语言开发的共享库方法实例
2015/03/18 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python制作抖音代码舞
2019/04/07 Python
python动态进度条的实现代码
2019/07/03 Python
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
大学生护理专业自荐信
2013/10/03 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
英文感谢信格式
2015/01/21 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript