1 /** 2 * 抓取远程图片到本地,可以抓取不带有后缀的图片 3 * @author YanYing <[email protected]> 4 * @link bidianer.com 5 */ 6 class GrabImage{ 7 8 /** 9 * @var string 需要抓取的远程图片的地址 10 * 例如:http://www.bidianer.com/img/icon_mugs.jpg 11 * 有一些远程文件路径可能不带拓展名 12 * 形如:http://www.xxx.com/img/icon_mugs/q/0 13 */ 14 private $img_url; 15 16 /** 17 * @var string 需要保存的文件名称 18 * 抓取到本地的文件名会重新生成名称 19 * 但是,不带拓展名 20 * 例如:57feefd7e2a7aY5p7LsPqaI-lY1BF 21 */ 22 private $file_name; 23 24 /** 25 * @var string 文件的拓展名 26 * 这里直接使用远程图片拓展名 27 * 对于没有拓展名的远程图片,会从文件流中获取 28 * 例如:.jpg 29 */ 30 private $extension; 31 32 /** 33 * @var string 文件保存在本地的目录 34 * 这里的路径是PHP保存文件的路径 35 * 一般相对于入口文件保存的路径 36 * 比如:./uploads/image/201610/19/ 37 * 但是该路径一般不直接存储到数据库 38 */ 39 private $file_dir; 40 41 /** 42 * @var string 数据库保存的文件目录 43 * 这个路径是直接保存到数据库的图片路径 44 * 一般直接保存日期 + 文件名,需要使用的时候拼上前面路径 45 * 这样做的目的是为了迁移系统时候方便更换路径 46 * 例如:201610/19/ 47 */ 48 private $save_dir; 49 50 /** 51 * @param string $img_url 需要抓取的图片地址 52 * @param string $base_dir 本地保存的路径,比如:./uploads/image,最后不带斜杠"/" 53 * @return bool|int 54 */ 55 public function getInstances($img_url , $base_dir) 56 { 57 $this->img_url = $img_url; 58 $this->save_dir = date("Ym").‘/‘.date("d").‘/‘; // 比如:201610/19/ 59 $this->file_dir = $base_dir.‘/‘.$this->save_dir.‘/‘; // 比如:./uploads/image/2016/10/19/ 60 return $this->start(); 61 } 62 63 /** 64 * 开始抓取图片 65 */ 66 private function start() 67 { 68 if($this->setDir()) 69 { 70 return $this->getRemoteImg(); 71 } 72 else 73 { 74 return false; 75 } 76 } 77 78 /** 79 * 检查图片需要保持的目录是否存在 80 * 如果不存在,则立即创建一个目录 81 * @return bool 82 */ 83 private function setDir() 84 { 85 if(!file_exists($this->file_dir)) 86 { 87 mkdir($this->file_dir,0777,TRUE); 88 } 89 90 $this->file_name = uniqid().rand(10000,99999);// 文件名,这里只是演示,实际项目中请使用自己的唯一文件名生成方法 91 92 return true; 93 } 94 95 /** 96 * 抓取远程图片核心方法,可以同时抓取有后缀名的图片和没有后缀名的图片 97 * 98 * @return bool|int 99 */ 100 private function getRemoteImg() 101 { 102 // mime 和 扩展名 的映射 103 $mimes=array( 104 ‘image/bmp‘=>‘bmp‘, 105 ‘image/gif‘=>‘gif‘, 106 ‘image/jpeg‘=>‘jpg‘, 107 ‘image/png‘=>‘png‘, 108 ‘image/x-icon‘=>‘ico‘ 109 ); 110 // 获取响应头 111 if(($headers=get_headers($this->img_url, 1))!==false) 112 { 113 // 获取响应的类型 114 $type=$headers[‘Content-Type‘]; 115 // 如果符合我们要的类型 116 if(isset($mimes[$type])) 117 { 118 $this->extension=$mimes[$type]; 119 $file_path = $this->file_dir.$this->file_name.".".$this->extension; 120 // 获取数据并保存 121 $contents=file_get_contents($this->img_url); 122 if(file_put_contents($file_path , $contents)) 123 { 124 // 这里返回出去的值是直接保存到数据库的路径 + 文件名,形如:201610/19/57feefd7e2a7aY5p7LsPqaI-lY1BF.jpg 125 return $this->save_dir.$this->file_name.".".$this->extension; 126 } 127 } 128 } 129 return false; 130 } 131 } 132 133 $object = new GrabImage();135 $img_url = ‘‘; // 需要抓取的远程图片 136 137 $base_dir = "./"; // 本地保存的路径 138 echo $object->getInstances($img_url , $base_dir);
时间: 2024-10-24 16:56:01