1. 程式人生 > >獲取遠程圖片保存到本地文件夾中

獲取遠程圖片保存到本地文件夾中

remote 重新 rem file 但是 sse 開始 創建 headers

  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);

獲取遠程圖片保存到本地文件夾中