创立名目
作为演示,咱们正在www根目次创立名目grabimg,创立一个类GrabImage.php以及一个index.php。
编写类代码
咱们界说一个以及文件名相反的类:GrabImage
class GrabImage{ }
属性
接上去界说几个需求应用的属性。
一、起首界说一个需求抓取的图片地点:$img_url
二、再界说一个$file_name用来存储文件的称号,然而没有携带拓展名,由于可能触及到拓展名改换,以是这里拆开界说
三、紧接着就是拓展名$extension
四、而后咱们界说一个$file_dir,该属性的作用是,近程图片抓取到内陆后所存储的目次,普通绝对于PHP入口文件所正在的地位作为肇始。然而该门路普通没有保留到数据库。
五、最初咱们界说一个$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文件内尝尝。
<?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); ?>
惹,确实抓取过去了
完好代码
<?php /** * 抓取近程图片到内陆,能够抓取没有带有后缀的图片 * @author YanYing <yanyinghq@163.com> * @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开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!