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
}
转载于:https://my.oschina.net/yonghan/blog/602485