PHP下载/采集远程图片到本地

jopen 8年前

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  }

 

来自: http://my.oschina.net/yonghan/blog/602485