PHP下載/采集遠程圖片到本地
PHP下載/采集遠程圖片到本地01 / 02 下載遠程圖片到本地 03 04 @param string $url 遠程文件地址 05 @param string $filename 保存后的文件名(為空時則為隨機生成的文件名,否則為原文件名) 06 @param array $fileType 允許的文件類型 07 @param string $dirName 文件保存的路徑(路徑其余部分根據時間系統自動生成) 08 @param int $type 遠程獲取文件的方式 09 @return json 返回文件名、文件的保存路徑 10 @author blog.snsgou.com 11 / 12 function download_image($url, $fileName = '', $dirName, $fileType = array('jpg', 'gif', 'png'), $type = 1) 13 { 14 if ($url == '') 15 { 16 return false; 17 } 18 19 // 獲取文件原文件名 20 $defaultFileName = basename($url); 21 22 // 獲取文件類型 23 $suffix = substr(strrchr($url, '.'), 1); 24 if (!in_array($suffix, $fileType)) 25 { 26 return false; 27 } 28 29 // 設置保存后的文件名 30 $fileName = $fileName == '' ? time() . rand(0, 9) . '.' . $suffix : $defaultFileName; 31 32 // 獲取遠程文件資源 33 if ($type) 34 { 35 $ch = curl_init(); 36 $timeout = 30; 37 curl_setopt($ch, CURLOPT_URL, $url); 38 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 39 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 40 $file = curl_exec($ch); 41 curl_close($ch); 42 } 43 else 44 { 45 ob_start(); 46 readfile($url); 47 $file = ob_get_contents(); 48 ob_end_clean(); 49 } 50 51 // 設置文件保存路徑 52 //$dirName = $dirName . '/' . date('Y', time()) . '/' . date('m', time()) . '/' . date('d', time()); 53 $dirName = $dirName . '/' . date('Ym', time()); 54 if (!file_exists($dirName)) 55 { 56 mkdir($dirName, 0777, true); 57 } 58 59 // 保存文件 60 $res = fopen($dirName . '/' . $fileName, 'a'); 61 fwrite($res, $file); 62 fclose($res); 63 64 return array( 65 'fileName' => $fileName, 66 'saveDir' => $dirName 67 ); 68 } 實戰經歷: 博客中有些圖片是直接引用其他網站的,這些天不知道咋地,估計是對方做了防盜鏈操作,導致博客中的圖片顯示不出來,沒辦法,只好用PHP批量采集下來,并且批量替換博文中的圖片地址: 01 / 02 批量下載博客中的圖片到本地 03 / 04 public function index() 05 { 06 global $_G; 07 08 $blogModel = model('Blog', 'blog'); 09 $list = $blogModel->order('gid desc')->limit(10)->findPage(); 10 11 $page = get_gpc('page') ? get_gpc('page') : 1; 12 $totalPages = $list['totalPages']; 13 $page = $page + 1; 14 15 if ($page > $totalPages) 16 { 17 die('更新完畢!'); 18 } 19 20 foreach ($list['data'] as $val) 21 { 22 $content = $val['content']; 23 $excerpt = $val['excerpt']; 24 25 $_G['isContentUpdate'] = $_G['isExcerptUpdate'] = false; 26 27 / 內容 / 28 $content = preg_replace_callback("/src=\"(http:\/\/images.cnblogs.com\/cnblogs_com[^\"]+)\"/", function($matches) { 29 30 global $_G; 31 $_G['isContentUpdate'] = true; 32 33 // 下載遠程圖片到本地 34 $res = download_image($matches[1], 'old', 'd:/PHP/xampp/htdocs/emlog/data/upload'); 35 36 // 返回 下載后的圖片url地址 37 return 'src="/data/upload/' . date('Ym', time()) . '/' . $res['fileName'] . '"'; 38 39 }, $content); 40 41 / 摘要 / 42 $excerpt = preg_replace_callback("/src=\"(http:\/\/images.cnblogs.com\/cnblogs_com[^\"]+)\"/", function($matches) { 43 44 global $_G; 45 $_G['isExcerptUpdate'] = true; 46 47 // 下載遠程圖片d到本地 48 $res = download_image($matches[1], 'old', 'd:/PHP/xampp/htdocs/emlog/data/upload'); 49 50 // 返回 下載后的圖片url地址 51 return 'src="/data/upload/' . date('Ym', time()) . '/' . $res['fileName'] . '"'; 52 53 }, $excerpt); 54 55 / 更新數據庫 / 56 $where = array( 57 'gid' => $val['gid'] 58 ); 59 $data = array(); 60 61 if ($_G['isContentUpdate']) 62 { 63 $data['content'] = $content; 64 } 65 66 if ($_G['isExcerptUpdate']) 67 { 68 $data['excerpt'] = $excerpt; 69 } 70 71 if ($data) 72 { 73 $blogModel->where($where)->save($data); 74 } 75 } 76 77 / 更新下一頁 / 78 $url = url('blog/Main/index', array('page' => $page)); 79 $msg = '正在更新' . $page . '/' . $totalPages; 80 redirect($url, 2, $msg); 81 }</pre>