宝哥软件园

PHP捕获远程图片(包括没有后缀的图片)

编辑:宝哥软件园 来源:互联网 时间:2021-09-14

首先,创建一个项目

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

第二,编写类代码

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

GrabImage { iii }类。属性

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

1.首先,定义要爬网的图像地址:$img_url

2.定义另一个$file_name来存储文件名,但它不包含扩展名。因为它可能涉及到扩展名的替换,所以定义在这里被分解

3,其次是扩展名称$extension

4.然后,我们定义一个$file_dir。这个属性的作用是远程图片在本地捕获后存储的目录一般从PHP入口文件的位置开始。但是,该路径通常不会保存到数据库中。

5.最后,我们定义一个$save_dir。顾名思义,这个路径是直接保存数据库的目录。这里说明的是,我们不直接将文件保存路径存储到数据库中,但是如果系统稍后迁移,通常会准备更改路径。我们这里的$save_dir通常是一个日期文件名。如果需要用,拿出来,在前面拼出需要的路径。

四.方法学

属性完成,然后我们正式开始爬行。

首先,我们定义一个开放的方法,getInstances,来获取一些数据,比如捕获图像地址和保存本地路径。同时,把它放在物业里。

公共函数getinstance($ img _ URL,$ base _ dir){ $ this-img _ URL=$ img _ URL;$this-save_dir=date('Ym ')。'/'.日期(' d ')。'/';//例如:201610/19/$ this-file _ dir=$ base _ dir。'/'.$ this-save _ dir。'/';//例如:/uploads/image/2016/10/19/}图像保存路径已拼接。接下来要注意一个问题,目录是否存在。日期按天计算,但目录不会自动创建。因此,在保存图片之前,我们需要先检查一下。如果当前目录不存在,我们需要立即创建它。

我们创建设置目录方法setDir。我们设定的私有财产,安全

/* * *检查图片需要保留的目录是否存在*如果不存在,请立即创建一个目录* @ returnbool */private函数setdir () {if(!file _ exists($ this-file _ dir)){ mkdir($ this-file _ dir,0777,TRUE);} $this-file_name=uniqid()。兰特(10000,99999);//文件名,这只是演示。请在实际项目中使用自己唯一的文件名生成方法返回true}下一步是抓取核心代码

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

我们必须通过其他方法得到图片类型。方法是从文件流信息中获取头信息,从而判断文件的mime信息,进而知道文件的后缀名称。

为了方便起见,首先定义一个mime和文件扩展名映射。

$mimes=array('image/bmp'='bmp ',' image/gif'='gif ',' image/jpeg'='jpg ',' image/png'='png ',' image/x-icon '=' ico ');这样,当我得到类型图像/gif时,我就可以知道它是。gif图片。

使用php函数get_headers获取文件流头信息。当它的值不为假时,我们将其分配给变量$headers

取出的内容类型的值是mime的值。

if(($ headers=get _ headers($ this-img _ URL,1))!==false){ //获取响应的类型$ Type=$ headers[' Content-Type '];}使用我们上面定义的映射表,我们可以轻松获得后缀名称。

$ this-extension=$ mimes[$ type];当然,上面获得的$类型可能不存在于我们的映射表中,这意味着这种类型的文件不是我们想要的,所以就丢弃它吧。

以下步骤与传统的文件抓取相同。

$file_path=$this-file_dir。$this-file_name。'.'。$ this-扩展;//获取数据并保存$ contents=file _ get _ contents($ this-img _ URL);if(file _ put _ contents($ file _ path,$ contents)){//这里返回的值是直接保存到数据库的路径的文件名,类似于:201610/19/57 feefd 7 e2a 7a 5a 7 LSP Qai-LY1BF.jpg Return $ this-save _ dir。$ this-file }首先获取本地图像保存的完整路径$file_path,然后用file_get_contents抓取数据,再用file_put_contents保存到刚才的文件路径。

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

抓取方法完整版本是:

私有函数getremoteimg () {//mime和扩展名$ mimes=array ('image/BMP'=' BMP ',' image/gif'=' gif ',' image/JPEG'=' jpg ',' image/png'=' png ',' image/x-icon' /获取响应头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-扩展;//获取数据并保存$ contents=file _ get _ contents($ this-img _ URL);if(file _ put _ contents($ file _ path,$ contents)){//这里返回的值是直接保存到数据库的路径的文件名,类似于:201610/19/57 feefd 7 e2a 7a 5a 7 LSP Qai-LY1BF.jpg Return $ this-save _ dir。$ this-file } } }返回false}最后,为了简单起见,我们想只调用其他地方的其中一个方法来完成爬行。因此,我们将抓取操作直接放入getInstances中,并在配置路径后直接抓取。因此,我们在初始化配置方法getInstances中添加代码。

if($ this-setDir()){ return $ this-getremote img();} else { return false}测试

让我们在新创建的index.php文件中尝试一下。

?PHP require _ once ' grabimage . PHP ';$ object=new GrabImage();$ img _ URL=' http://www . bidianer.com/img/icon _ mugs . jpg ';//要爬网的远程映像$base_dir='。/uploads/image ';//本地保存的路径echo $ object-getinstance($ img _ URL,$ base _ dir);我确实抓住了它

完全码

?Php/** *抓取远程图片到本地,可以抓取不带后缀的图片* @ authoryanying[email protected]* @ 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字符串文件名*本地文件名被抓取时会重新生成该名称*但是,不带扩展名*例如:57feefd 7 e2a 7a 5 p7lsp QAI-LY1BF */private $ file _ name;/* * * @ varstring文件的扩展名*此处直接使用远程图片的扩展名*对于没有扩展名的远程图片,将从文件流*中获取例如:jpg */private $扩展名;/** * @var字符串文件保存在本地目录*这里的路径是PHP保存文件的路径*一般是相对于条目文件保存的路径*例如:/uploads/image/201610/19/*,但此路径一般不会直接存储在数据库*/private $file_dir中;/* * * * *数据库保存的var字符串文件目录*此路径是直接保存到数据库的图片路径*一般直接保存日期文件名,需要使用时会拼上一个路径*这样做的目的是为了迁移系统时方便更改路径*例如:201610/19/*/private $ save _ dir;/** * @param string $img_url要爬网的图片地址* @param string $base_dir路径保存在本地,例如:/uploads/image,不带斜杠'/' * @ returnbool | int */public function getinstance($ img _ URL,$ base _ dir){ $ this-img _ URL=$ img _ URL;$this-save_dir=date('Ym ')。'/'.日期(' d ')。'/';//例如:201610/19/$ this-file _ dir=$ base _ dir。'/'.$ this-save _ dir。'/';//例如:/uploads/image/2016/10/19/return $ this-start();}/* * *开始抓取图片*/private函数start(){ if($ this-setdir()){ return $ this-getremote img();} else { return false}}/* * *检查图片需要保留的目录是否存在*如果不存在,立即创建目录* @ Return Bool */Private Function Set Dir(){ If(!file _ exists($ this-file _ dir)){ mkdir($ this-file _ dir,0777,TRUE);} $this-file_name=uniqid()。兰特(10000,99999);//文件名,这只是演示。请在实际项目中使用自己唯一的文件名生成方法返回true}/* * *捕获远程图片核心方法,既可以抓取带后缀的图片,也可以抓取不带后缀的图片* * @ returnbool | int */private函数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-扩展;//获取数据并保存$ contents=file _ get _ contents($ this-img _ URL);if(file _ put _ contents($ file _ path,$ contents)){//这里返回的值是直接保存到数据库的路径的文件名,类似于:201610/19/57 feefd 7 e2a 7a 5a 7 LSP Qai-LY1BF.jpg Return $ this-save _ dir。$ this-file } } }返回false}}摘要

以上就是本文的全部内容。希望对你学习或使用PHP有所帮助。有问题可以留言交流。

更多资讯
游戏推荐
更多+