以前作微信登陆开发时候,发现微信头像图片没有后缀名,传统的图片抓取方式不奏效,须要特殊的抓取处理。因此,后来将各类状况结合起来,封装成一个类,分享出来。php
建立项目数据库
做为演示,咱们在www根目录建立项目grabimg,建立一个类GrabImage.php和一个index.php。安全
编写类代码微信
咱们定义一个和文件名相同的类:GrabImage函数
1测试 2ui |
|
属性spa
接下来定义几个须要使用的属性。
一、首先定义一个须要抓取的图片地址:$img_url
二、再定义一个$file_name用来存储文件的名称,可是不携带拓展名,由于可能涉及到拓展名更换,因此这里拆开定义
三、紧接着就是拓展名$extension
四、而后咱们定义一个$file_dir,该属性的做用是,远程图片抓取到本地后所存储的目录,通常相对于PHP入口文件所在的位置做为起始。可是该路径通常不保存到数据库。
五、最后咱们定义一个$save_dir,顾名思义,该路径是用来直接保存的数据库的目录。这里说明下,咱们不直接存储文件保存路径到数据库,通常是为了以后若是系统迁移,方便更换路径作准备。咱们这里的$save_dir通常为日期 + 文件名,若是须要使用时候取出,在前方拼上所须要的路径。
方法
属性弄完了,接下来咱们正式开始抓取工做。
首先咱们定义一个对外开放的方法getInstances用来获取一些数据,好比抓取图片地址,和本地保存路径。同时将其放入属性中。
1 2 3 4 5 6 |
|
图片保存路径拼接完成,下面咱们要注意一个问题,目录是否存在。日期在一每天走,可是目录并不会自动建立。因此,在保存图片以前,首先须要检查一下,若是当前目录不存在咱们须要即时建立。
咱们建立设置目录方法setDir。属性咱们设置了private,安全
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
接下来就是抓取核心代码
第一步,解决一个问题,咱们须要抓取的图片可能没有后缀名。按照传统的抓取方法,先抓取图片,而后截取后缀名的方案不可行。
咱们必须经过其它方法来得到图片类型。办法就是从文件流信息中获取文件头信息,从而判断文件mime信息,就能够知道文件后缀名。
为了方便,先定义一个mime和文件拓展名映射。
1 2 3 4 5 6 7 |
|
这样,当我获取了类型是image/gif的时候,我就能够知道是.gif图片了。
利用php函数get_headers,获取文件流头信息。当其值不为false时候咱们将其赋值给变量$headers
取出Content-Type的值即为mime的值。
1 2 3 4 |
|
使用上面咱们定义的映射表,咱们能够很轻松的获取后缀名。
1 |
|
固然上面获取的$type,可能不存在咱们的映射表中,说明这种类型文件并非咱们想要的,直接抛弃就行了,不用管它。
下面的步骤就和传统抓取文件同样。
1 2 3 4 5 6 7 8 |
|
首先获取本地保图片存完整路径$file_path,接下来使用file_get_contents抓取数据,而后使用file_put_contents保存到刚刚的文件路径。
最后咱们返回一个能够直接保存到数据库中的路径,而不是文件存储路径。
该抓取方法完整版是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
最后,为了简单,咱们想在其余地方只要调用其中一个方法就能够完成抓取。因此,咱们将抓取动做直接放入到getInstances中,在配置完路径后,直接抓取,因此,在初始化配置方法getInstances里新增代码。
1 2 3 4 5 6 7 8 |
|
测试
咱们去刚刚建立的index.php文件内试试。
1 2 3 4 5 6 7 |
|
惹,的确抓取过来了
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
|