QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2204|回复: 1

[PHP开发] PHP下载/采集远程图片到本地

[复制链接]

300

主题

317

帖子

1091

积分

中级会员

Rank: 3Rank: 3

积分
1091
发表于 2016-1-15 09:49:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
PHP下载/采集远程图片到本地
  1. /**
  2. * 下载远程图片到本地
  3. *
  4. * @param string $url 远程文件地址
  5. * @param string $filename 保存后的文件名(为空时则为随机生成的文件名,否则为原文件名)
  6. * @param array $fileType 允许的文件类型
  7. * @param string $dirName 文件保存的路径(路径其余部分根据时间系统自动生成)
  8. * @param int $type 远程获取文件的方式
  9. * @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.     $defaultFileName = Basename($url);
  20.     // 获取文件类型
  21.     $suffix = substr(strrchr($url, '.'), 1);
  22.     if (!in_array($suffix, $fileType))
  23.     {
  24.         return false;
  25.     }
  26.     // 设置保存后的文件名
  27.     $fileName = $fileName == '' ? time() . rand(0, 9) . '.' . $suffix : $defaultFileName;
  28.     // 获取远程文件资源
  29.     if ($type)
  30.     {
  31.         $ch = curl_init();
  32.         $timeout = 30;
  33.         curl_setopt($ch, CURLOPT_URL, $url);
  34.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  35.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  36.         $file = curl_exec($ch);
  37.         curl_close($ch);
  38.     }
  39.     else
  40.     {
  41.         ob_start();
  42.         readfile($url);
  43.         $file = ob_get_contents();
  44.         ob_end_clean();
  45.     }
  46.     // 设置文件保存路径
  47.     //$dirName = $dirName . '/' . date('Y', time()) . '/' . date('m', time()) . '/' . date('d', time());
  48.     $dirName = $dirName . '/' . date('Ym', time());
  49.     if (!file_exists($dirName))
  50.     {
  51.         mkdir($dirName, 0777, true);
  52.     }
  53.     // 保存文件
  54.     $res = fopen($dirName . '/' . $fileName, 'a');
  55.     fwrite($res, $file);
  56.     fclose($res);
  57.     return array(
  58.         'fileName' => $fileName,
  59.         'saveDir' => $dirName
  60.     );
  61. }
复制代码
实战经历:
博客中有些图片是直接引用其他网站的,这些天不知道咋地,估计是对方做了防盗链操作,导致博客中的图片显示不出来,没办法,只好用PHP批量采集下来,并且批量替换博文中的图片地址:
  1. /**
  2. * 批量下载博客中的图片到本地
  3. */
  4. public function index()
  5. {
  6.     global $_G;
  7.     $blogModel = model('Blog', 'blog');
  8.     $list = $blogModel->order('gid desc')->limit(10)->findPage();
  9.     $page = get_gpc('page') ? get_gpc('page') : 1;
  10.     $totalPages = $list['totalPages'];
  11.     $page = $page + 1;
  12.     if ($page > $totalPages)
  13.     {
  14.         die('更新完毕!');
  15.     }
  16.     foreach ($list['data'] as $val)
  17.     {
  18.         $content = $val['content'];
  19.         $excerpt = $val['excerpt'];
  20.         $_G['isContentUpdate'] = $_G['isExcerptUpdate'] = false;
  21.         /* 内容 */
  22.         $content = preg_replace_callback("/src="(http:\/\/images\.cnblogs\.com\/cnblogs_com[^"]+)"/", function($matches) {
  23.             global $_G;
  24.             $_G['isContentUpdate'] = true;
  25.             // 下载远程图片到本地
  26.             $res = download_image($matches[1], 'old', 'd:/PHP/xampp/htdocs/emlog/data/upload');
  27.             // 返回 下载后的图片url地址
  28.             return 'src="/data/upload/' . date('Ym', time()) . '/' . $res['fileName'] . '"';
  29.         }, $content);
  30.         /* 摘要 */
  31.         $excerpt = preg_replace_callback("/src="(http:\/\/images\.cnblogs\.com\/cnblogs_com[^"]+)"/", function($matches) {
  32.             global $_G;
  33.             $_G['isExcerptUpdate'] = true;
  34.             // 下载远程图片d到本地
  35.             $res = download_image($matches[1], 'old', 'd:/PHP/xampp/htdocs/emlog/data/upload');
  36.             // 返回 下载后的图片url地址
  37.             return 'src="/data/upload/' . date('Ym', time()) . '/' . $res['fileName'] . '"';
  38.         }, $excerpt);
  39.         /* 更新数据库 */
  40.         $where = array(
  41.             'gid' => $val['gid']
  42.         );
  43.         $data = array();
  44.         if ($_G['isContentUpdate'])
  45.         {
  46.             $data['content'] = $content;
  47.         }
  48.         if ($_G['isExcerptUpdate'])
  49.         {
  50.             $data['excerpt'] = $excerpt;
  51.         }
  52.         if ($data)
  53.         {
  54.             $blogModel->where($where)->save($data);
  55.         }
  56.     }
  57.     /* 更新下一页 */
  58.     $url = url('blog/Main/index', array('page' => $page));
  59.     $msg = '正在更新' . $page . '/' . $totalPages;
  60.     redirect($url, 2, $msg);
  61. }
复制代码


642

主题

801

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10818
发表于 2016-1-15 11:52:21 | 显示全部楼层
感谢楼主分享
招募核心会员担任PHP-Z版主和管理员,共同管理论坛和群组,有意者在论坛发消息联系我
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

     
    战略合作|联系方式|广告赞助|商务合作|手机版|小黑屋|( 京ICP备14036609号-6 )

GMT+8, 2017-6-28 03:11

© 2013-2017 Powered by Discuz! X3.3. 本站由 又拍云 提供 CDN 图片存储服务 七牛 提供 CDN 静态文件加速服务

快速回复 返回顶部 返回列表