明凯博客

关注网站技术,一个特立独行的全栈程序员

ecshop远程商品详情图片本地化保存到本地的方法

凯芭比童装产品都是凯芭比童装淘宝店导出来的,这就导致了很多图片是淘宝CDN那边的图片。
为了seo着想,我想把淘宝的图片转移到本地。
于是我缕了一下思路。

1,从数据库获取产品详情描述
2,正则找出所有https的图片
3,将图片保存到本地
4,替换https图片为本地图片
5,更新数据库
6,循环上面的操作直到找不到https图片
7,完成

下面我们来看看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
< ?php
 
// 载入配置文件  
set_time_limit(0);  
include("data/config.php");  
 
// 数据库连接 
$link=mysql_connect($db_host,$db_user,$db_pass)or die("connect error");  
mysql_select_db($db_name,$link)or die(mysql_error());  
mysql_query("set names utf8");  
 
header("Content-type:text/html;charset=utf-8");  
 
// 获取参数 
$id=intval($_GET['id']);  
 
// 获取全部产品图片 
if($id==0){  
 
$sql="select `goods_id`,`goods_name`,`goods_desc` from `kbb_goods` order by goods_id desc ";  
$res=mysql_query($sql);  
while($row=mysql_fetch_array($res))  
{  
    $aa="<span style='color:#cccccc;font-size:12px;'>无远程图片";  
    if(preg_match('/(https:\/\/)/i', $row['goods_desc'])){  
        $aa="<a target='_blank' href='?id=".$row['goods_id']."' style='color:#ff0000;font-size:12px;'>Go Get It</a>";  
    }  
    echo "<span style='font-size:12px;line-height:150%;'>".$row['goods_id']." ".$row['goods_name']." ".$aa."</span><br />";  
}  
 
exit();  
}
 
// 睡眠一秒   
sleep(1); 
 
// 获取单个产品
$sql="select `goods_desc` from `kbb_goods` where `goods_id`='$id' limit 1";  
$res=mysql_fetch_array(mysql_query($sql));
 
// 匹配图片
preg_match_all('/src=[\'|"]([^"|^\']+)[\'|"]/i', $res[0], $picurl);   
$urlArr=$picurl[1];  
 
$num= isset($_GET['num']) ? $_GET['num'] : 1;  
$all=count($urlArr);  
 
// 获取远程图片链接  
$url=$urlArr[$num-1];   
 
// 匹配远程图片 
if(!preg_match('/(https:\/\/)/i', $url)){  
    if($num >= $all) {  
    exit('<br />all done!');  
    }  
    echo $url."<br /> 已处理";  
    echo "<script>location.href='?id={$id}&num=".($num+1)."'</script>";  
    exit();  
}   
 
// 获取远程图片信息    
$array=@get_headers($url,1);  
 
echo "old image:".$url."<br /><br />"; 
 
if(preg_match('/200/',$array[0])){
 
    // 写入缓冲区  
    ob_start();   
    readfile($url);  
    $img = ob_get_contents();  
    ob_end_clean();
 
    // 创建目录
    $dir="images/desc/".$id;  
    !file_exists($dir)&&mkdir($dir, 0777,true);  
 
    // 写入文件  
    $filename=$dir."/".mt_rand(100000,999999).time().".jpg";  
    $f=fopen($filename,'a');  
    $fres=fwrite($f,$img);  
    fclose($f);  
 
    echo "new image:".$filename."<br /><br />";
 
    // 更新数据库  
    if($fres!=false){  
        $goods_desc=str_replace($url,"/".$filename,$res[0]);  
        $sql="update `kbb_goods` set  `goods_desc` = '$goods_desc' where `goods_id`='$id' limit 1 ";  
        mysql_query($sql);  
    }  
 
}  
 
// 输出处理张数 
echo $num."/".$all;  
 
// 结束处理 
if($num >= $all) {   
    exit('<br />all done!');  
}  
else{   
    echo "<script>location.href='?id={$id}&num=".($num+1)."'</script>";  
}  
 
?>

上面的代码在我的商城里面运行很好,我额外加了所有的产品列表来查看是否要替换图片,这样子就比较清楚了。
现在来看一下列表的效果图

然后看一下运行的效果

最后我放弃了这种方法,还是用了淘宝cdn的图片,因为后面产品越来越多,没必要浪费磁盘的空间。

, , ,

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注