PHP下载/采集远程图片到本地
jopen
9年前
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 }