一、创建项目

作为演示,我们在www根目录创建项目grabimg,创建一个类GrabImage.php和一个index.php。

二、编写类代码

我们定义一个和文件名相同的类:GrabImage

class GrabImage{

}

三、属性

接下来定义几个需要使用的属性。

1、首先定义一个需要抓取的图片地址:$img_url

2、再定义一个$file_name用来存储文件的名称,但是不携带拓展名,因为可能涉及到拓展名更换,所以这里拆开定义

3、紧接着就是拓展名$extension

4、然后我们定义一个$file_dir,该属性的作用是,远程图片抓取到本地后所存储的目录,一般相对于PHP入口文件所在的位置作为起始。但是该路径一般不保存到数据库。

5、最后我们定义一个$save_dir,顾名思义,该路径是用来直接保存的数据库的目录。这里说明下,我们不直接存储文件保存路径到数据库,一般是为了之后如果系统迁移,方便更换路径做准备。我们这里的$save_dir一般为日期 + 文件名,如果需要使用时候取出,在前方拼上所需要的路径。

四、方法

属性弄完了,接下来我们正式开始抓取工作。

首先我们定义一个对外开放的方法getInstances用来获取一些数据,比如抓取图片地址,和本地保存路径。同时将其放入属性中。

public function getInstances($img_url , $base_dir)

{

$this->img_url = $img_url;

$this->save_dir = date("Ym")."/".date("d")."/"; // 比如:201610/19/

$this->file_dir = $base_dir."/".$this->save_dir."/"; // 比如:./uploads/image/2016/10/19/

}

图片保存路径拼接完成,下面我们要注意一个问题,目录是否存在。日期在一天天走,但是目录并不会自动创建。所以,在保存图片之前,首先需要检查一下,如果当前目录不存在我们需要即时创建。

我们创建设置目录方法setDir。属性我们设置了private,安全

/**

* 检查图片需要保持的目录是否存在

* 如果不存在,则立即创建一个目录

* @return bool

*/

private function setDir()

{

if(!file_exists($this->file_dir))

{

mkdir($this->file_dir,0777,TRUE);

}

$this->file_name = uniqid().rand(10000,99999);// 文件名,这里只是演示,实际项目中请使用自己的唯一文件名生成方法

return true;

}

接下来就是抓取核心代码

第一步,解决一个问题,我们需要抓取的图片可能没有后缀名。按照传统的抓取方法,先抓取图片,然后截取后缀名的方案不可行。

我们必须通过其它方法来获得图片类型。办法就是从文件流信息中获取文件头信息,从而判断文件mime信息,就可以知道文件后缀名。

为了方便,先定义一个mime和文件拓展名映射。

$mimes=array(

"image/bmp"=>"bmp",

"image/gif"=>"gif",

"image/jpeg"=>"jpg",

"image/png"=>"png",

"image/x-icon"=>"ico"

);

这样,当我获取了类型是image/gif的时候,我就可以知道是.gif图片了。

利用php函数get_headers,获取文件流头信息。当其值不为false时候我们将其赋值给变量$headers

取出Content-Type的值即为mime的值。

if(($headers=get_headers($this->img_url, 1))!==false){

// 获取响应的类型

$type=$headers["Content-Type"];

}

使用上面我们定义的映射表,我们可以很轻松的获取后缀名。

$this->extension=$mimes[$type];

当然上面获取的$type,可能不存在我们的映射表中,说明这种类型文件并不是我们想要的,直接抛弃就好了,不用管它。

下面的步骤就和传统抓取文件一样。

$file_path = $this->file_dir.$this->file_name.".".$this->extension;

// 获取数据并保存

$contents=file_get_contents($this->img_url);

if(file_put_contents($file_path , $contents))

{

// 这里返回出去的值是直接保存到数据库的路径 + 文件名,形如:201610/19/57feefd7e2a7aY5p7LsPqaI-lY1BF.jpg

return $this->save_dir.$this->file_name.".".$this->extension;

}

首先获取本地保图片存完整路径$file_path,接下来使用file_get_contents抓取数据,然后使用file_put_contents保存到刚刚的文件路径。

最后我们返回一个可以直接保存到数据库中的路径,而不是文件存储路径。

该抓取方法完整版是:

private function getRemoteImg()

{

// mime 和 扩展名 的映射

$mimes=array(

"image/bmp"=>"bmp",

"image/gif"=>"gif",

"image/jpeg"=>"jpg",

"image/png"=>"png",

"image/x-icon"=>"ico"

);

// 获取响应头

if(($headers=get_headers($this->img_url, 1))!==false)

{

// 获取响应的类型

$type=$headers["Content-Type"];

// 如果符合我们要的类型

if(isset($mimes[$type]))

{

$this->extension=$mimes[$type];

$file_path = $this->file_dir.$this->file_name.".".$this->extension;

// 获取数据并保存

$contents=file_get_contents($this->img_url);

if(file_put_contents($file_path , $contents))

{

// 这里返回出去的值是直接保存到数据库的路径 + 文件名,形如:201610/19/57feefd7e2a7aY5p7LsPqaI-lY1BF.jpg

return $this->save_dir.$this->file_name.".".$this->extension;

}

}

}

return false;

}

最后,为了简单,我们想在其他地方只要调用其中一个方法就可以完成抓取。所以,我们将抓取动作直接放入到getInstances中,在配置完路径后,直接抓取,所以,在初始化配置方法getInstances里新增代码。

if($this->setDir())

{

return $this->getRemoteImg();

}

else

{

return false;

}

测试

我们去刚刚创建的index.php文件内试试。

require_once "GrabImage.php";

$object = new GrabImage();

$img_url = "http://www.bidianer.com/img/icon_mugs.jpg"; // 需要抓取的远程图片

$base_dir = "./uploads/image"; // 本地保存的路径

echo $object->getInstances($img_url , $base_dir);

?>

的确抓取过来了

完整代码

/**

* 抓取远程图片到本地,可以抓取不带有后缀的图片

* @author YanYing

* @link bidianer.com

*/

class GrabImage{

/**

* @var string 需要抓取的远程图片的地址

* 例如:http://www.bidianer.com/img/icon_mugs.jpg

* 有一些远程文件路径可能不带拓展名

* 形如:http://www.xxx.com/img/icon_mugs/q/0

*/

private $img_url;

/**

* @var string 需要保存的文件名称

* 抓取到本地的文件名会重新生成名称

* 但是,不带拓展名

* 例如:57feefd7e2a7aY5p7LsPqaI-lY1BF

*/

private $file_name;

/**

* @var string 文件的拓展名

* 这里直接使用远程图片拓展名

* 对于没有拓展名的远程图片,会从文件流中获取

* 例如:.jpg

*/

private $extension;

/**

* @var string 文件保存在本地的目录

* 这里的路径是PHP保存文件的路径

* 一般相对于入口文件保存的路径

* 比如:./uploads/image/201610/19/

* 但是该路径一般不直接存储到数据库

*/

private $file_dir;

/**

* @var string 数据库保存的文件目录

* 这个路径是直接保存到数据库的图片路径

* 一般直接保存日期 + 文件名,需要使用的时候拼上前面路径

* 这样做的目的是为了迁移系统时候方便更换路径

* 例如:201610/19/

*/

private $save_dir;

/**

* @param string $img_url 需要抓取的图片地址

* @param string $base_dir 本地保存的路径,比如:./uploads/image,最后不带斜杠"/"

* @return bool|int

*/

public function getInstances($img_url , $base_dir)

{

$this->img_url = $img_url;

$this->save_dir = date("Ym")."/".date("d")."/"; // 比如:201610/19/

$this->file_dir = $base_dir."/".$this->save_dir."/"; // 比如:./uploads/image/2016/10/19/

return $this->start();

}

/**

* 开始抓取图片

*/

private function start()

{

if($this->setDir())

{

return $this->getRemoteImg();

}

else

{

return false;

}

}

/**

* 检查图片需要保持的目录是否存在

* 如果不存在,则立即创建一个目录

* @return bool

*/

private function setDir()

{

if(!file_exists($this->file_dir))

{

mkdir($this->file_dir,0777,TRUE);

}

$this->file_name = uniqid().rand(10000,99999);// 文件名,这里只是演示,实际项目中请使用自己的唯一文件名生成方法

return true;

}

/**

* 抓取远程图片核心方法,可以同时抓取有后缀名的图片和没有后缀名的图片

*

* @return bool|int

*/

private function getRemoteImg()

{

// mime 和 扩展名 的映射

$mimes=array(

"image/bmp"=>"bmp",

"image/gif"=>"gif",

"image/jpeg"=>"jpg",

"image/png"=>"png",

"image/x-icon"=>"ico"

);

// 获取响应头

if(($headers=get_headers($this->img_url, 1))!==false)

{

// 获取响应的类型

$type=$headers["Content-Type"];

// 如果符合我们要的类型

if(isset($mimes[$type]))

{

$this->extension=$mimes[$type];

$file_path = $this->file_dir.$this->file_name.".".$this->extension;

// 获取数据并保存

$contents=file_get_contents($this->img_url);

if(file_put_contents($file_path , $contents))

{

// 这里返回出去的值是直接保存到数据库的路径 + 文件名,形如:201610/19/57feefd7e2a7aY5p7LsPqaI-lY1BF.jpg

return $this->save_dir.$this->file_name.".".$this->extension;

}

}

}

return false;

}

}

总结

以上就是这篇文章的全部内容了,希望能对大家学习或者使用PHP能有所帮助,如果有疑问大家可以留言交流。

php图片截取后缀,PHP抓取远程图片(含不带后缀的)教程详解相关推荐

  1. 图片本地化 php,php抓取远程图片本地化函数,很好用的.喜欢的拿去

    /** *功能:php完美实现下载远程图片保存到本地 *参数:文件url,保存文件目录,保存文件名称,使用的下载方式 *当保存文件名称为空时则使用远程文件原来的名称 */ protected func ...

  2. PHP抓取远程图片教程(包含不带后缀图片)

    之前做微信登录开发时候,发现微信头像图片没有后缀名,传统的图片抓取方式不奏效,需要特殊的抓取处理.所以,后来将各种情况结合起来,封装成一个类,分享出来. 创建项目 作为演示,我们在www根目录创建项目 ...

  3. 百度UEditor编辑器关闭抓取远程图片功能(默认开启)

    2019独角兽企业重金招聘Python工程师标准>>> 这个坑娘的功能,开始时居然不知道如何触发,以为有个按钮,点击一下触发,翻阅了文档,没有发现,然后再网络上看到原来是复制粘贴非白 ...

  4. ueditor抓取远程图片php版,Ueditor百度编辑器远程抓取图片的开启与关闭

    前言 这几天一直被百度编辑器自动抓取远程图片的功能困扰.因为这个功能吧,总是时灵时不灵的.有时候会抓取远程图片,有时候又不会抓取远程图片.相信各位都有遇到过.本人对编辑器没有太多的了解,下面如果有讲错 ...

  5. ueditor抓取远程图片php版,ueditor远程图片本地化的实现

    /** * 拉取远程图片 * @return mixed */ private function saveRemote() { $imgUrl = htmlspecialchars($this-> ...

  6. python抓取网站图片_利用python抓取网站图片

    看了网上关于python抓取网站图片的例子,所以自己也尝试着写一个,但是发现这个网站的src不是标准的路径,需要自己添加前面的目录地址,尝试了几次也不成功,所以希望有经验的朋友指导下. 本人是初学者, ...

  7. php抓取远程图片到本地,php获取远程图片保存到本地

    本函数主要功能: 获取远程图片并把它保存到本地,确定有把文件写入本地服务器的权限. 变量说明: $url 是远程图片的完整URL地址,不能为空. $filename 是可选变量: 如果为空,本地文件名 ...

  8. python爬虫爬取网页图片_Python爬虫实现抓取网页图片

    在逛贴吧的时候看见贴吧里面漂亮的图片,或有漂亮妹纸的图片,是不是想保存下来? 但是有的网页的图片比较多,一个个保存下来比较麻烦. 最近在学Python,所以用Python来抓取网页内容还是比较方便的: ...

  9. python爬虫之js链接跳转抓取_Python爬虫获取页面所有URL链接过程详解

    如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解析,提取出所有的URL. 什么是Beautiful Soup ...

最新文章

  1. 安装linux系统选择重新分区会怎么样,弱弱的问一下 双系统安装中linux如何分区?分区太多会不会不好?...
  2. 第三周的学习进度情况
  3. 学习python内一般函数知识
  4. AS打包APK时,一直缺失so库的解决办法
  5. 如何拯救无法「深度学习」的制造业,2019工业智能灵魂10问
  6. k8s部署微服务项目
  7. Python绝技第一章 入门 python3实现密码破解
  8. 从Page结构来看达梦数据库是不是纯自研
  9. ibm服务器有哪些型号,IBM服务器各个机型所对应ServerGuide引导光盘.doc
  10. 个人云盘、企业云盘傻傻分不清楚?3分钟带你清晰两者差异!...
  11. 消防法及相关法律法规(一)
  12. 【面试题】755- 104道 CSS 面试题,助你查漏补缺(上)
  13. 您访问的网页出错了!
  14. 微信小程序开发入门教程(十一)
  15. 【二】Jmeter代理服务器录制请求
  16. 论文阅读笔记之《Learning Deep Correspondence through Prior and Posterior Feature Constancy》
  17. HTML+CSS(基础)
  18. linux 命令运行包名,命令汇总 - SegmentFault 思否
  19. 基于wxapp的圣诞帽头像小程序【完整项目源码】
  20. 石砸天——寒门再难出贵子

热门文章

  1. 成都2021高考二诊成绩查询,成都市2020高三二诊成绩查询
  2. 两表左连接count某一字段_表连接解决多日留存率问题|SQL
  3. android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)
  4. php拉取公众号所有关注的人,微信公众平台开发获取关注者列表
  5. python切换ip群发邮件_python获取外网IP并发邮件的实现方法
  6. c语言大作业教室预约管理系统,C语言程序设计——教室管理系统(源代码))
  7. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](3)
  8. java服务器内存问题_java内存泄漏5种情况总结
  9. 最简单的c语言的编程题目,编程列入考题
  10. python break语句作用_Python