php下载远程图片到本地
在使用 PHP 做简单的爬虫的时候,我们经常会遇到需要下载远程图片的需求,所以下面来简单实现这个需求
1:使用curl
比如我们有下面这两张图片:
$images = [
'https://img.alicdn.com/tps/TB1jjaYOFXXXXa2aXXXXXXXXXXX-276-402.jpg_150x10000q90.jpg',
'https://img.alicdn.com/tfs/TB15QQ5cgMPMeJjy1XbXXcwxVXa-520-280.jpg_q90_.webp'
];
第一步,我们可以直接来使用最简单的代码实现:
function download($url, $path = 'images/')
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
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);
}
1:封装成一个类
缕清思路之后,我们可以将这个基本的功能封装到一个类中:
class Spider {
public function downloadImage($url, $path = 'images/')
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
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);
}
}
或者,我们还可以这样稍微优化一下:
class Spider {
public function downloadImage($url, $path='images/')
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
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了....
或者再这样完善下下载方法的封装:
/**
* 下载远程图片保存到本地
* @access public
* @author lxhui<772932587@qq.com>
* @since 1.0
* @return array
* @params string $url 远程图片地址
* @params string $save_dir 需要保存的地址
* @params string $filename 保存文件名
*/
function download($url, $save_dir = './public/upload/loan/',$filename='')
{
if(trim($save_dir)=='')
$save_dir='./'; if(trim($filename)==''){//保存文件名
$allowExt = array('gif', 'jpg', 'jpeg', 'png', 'bmp');
$ext=strrchr($url,'.');
if(!in_array($ext,$allowExt))
return array('file_name'=>'','save_path'=>'','error'=>3); $filename=time().$ext;
}
if(0!==strrpos($save_dir,'/'))
$save_dir.='/'; //创建保存目录
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true))
return array('file_name'=>'','save_path'=>'','error'=>5); $ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
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($save_dir . $filename, 'a');
fwrite($resource, $file);
fclose($resource);
unset($file,$url);
return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
}
php下载远程图片到本地的更多相关文章
- thinkphp下载远程图片到本地
$url="http://www.test.com/test.jpg";//图片远程地址 $local="./Upload/test/test.jpg";//下 ...
- PHP通过url下载远程图片到本地
function GrabImage($url,$filename) { if($url==""):return false;endif; ob_start(); readfile ...
- PHP下载远程图片到本地的几种方法总结(tp5.1)
1.CURL 2.使用file_get_contents 3.使用fopen 参考链接:https://www.jb51.net/article/110615.htm
- PHP下载/采集远程图片到本地
/** * 下载远程图片到本地 * * @param string $url 远程文件地址 * @param string $filenNme 保存后的文件名(为空时则为随机生成的文件名,否则为原文件 ...
- php下载远程图片方法总结(curl手动解析header)curl跳转问题解决
常用方法一般有:. file_get_contents file_put_contents readfile($file) //效率很高. 一般代码: /** * 抓取远程图片 * * @param ...
- python多线程批量下载远程图片
python多线程使用场景:多线程采集, 以及性能测试等 . 数据库驱动类-简单封装下 mysqlDriver.py #!/usr/bin/python3 #-*- coding: utf-8 -*- ...
- php 下载远程图片 的几种方法(转)
1.获取远程文件大小及信息的函数 function getFileSize($url){ $url = parse_url($url); if($fp = @fso ...
- java下载远程文件到本地
java下载远程文件到本地(转载:http://www.cnblogs.com/qqzy168/archive/2013/02/28/2936698.html) /** * 下载远程文 ...
- 【Python】【Nodejs】下载单张图片到本地,Python和Nodejs的比较
Python版本: # 下载单张图片到本地,看用时多少 import urllib.request import datetime starttime = datetime.datetime.now( ...
随机推荐
- Python_day6
Δ汉诺塔例子 # 定义三个全局的列表 la = [] lb = [] lc = [] stepn = 0 def create_hano(n): '''构建由n个圆盘组成的汉诺塔''' global ...
- 171. Excel表列序号
题目:给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> ...
- UIAlertControllerStyleActionSheet 崩溃。
即使Devices 设置为iPhone模式,在审核时还是运行在iPad的小屏模式下.因此必须 UIActivityViewController UIAlertControllerStyleAction ...
- Java 获取当前项目所在服务器的 IP 地址
java中获取当前服务器地址主要使用到InetAddress这个类 public static void main(String[] args) { try { //用 getLocalHost() ...
- maven配置多仓库的方法
刚接触maven就是在公司里配置好的,所以一直以来使用都没毛病,所以一直没有去动这些固有的东西. 但是,后来把公司的电脑拿回家之后,发现有的东西就搞不起来了.原因也看一下就明白了,因为在公司的时候用的 ...
- PyTorch(一)Basics
PyTorch Basics import torch import torchvision import torch.nn as nn import numpy as np import torch ...
- Python基础教程(第3版) 笔记(二)
1.8模块Python提供了完成(某人的年 龄为32.9,并想将这个值向下圆整为32,因为他还没有满33岁)这种任务的函 数floor.导入模块,可以使用特殊命令import.函数floor包含在模块 ...
- Ubantu常用命令
Ubantu常用命令 ctrl alt t :打开终端 ctrl d : 关闭终端 F11 : 终端全屏,再按一次退出全屏 Super(即win) ...
- .NET内存管理、垃圾回收
1. Stack和Heap 每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况.值类型变量(函数的参数.局部变量 等非成员变量)都分配 ...
- MySQL 设计规范
一.数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名 ...