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的图片,因为后面产品越来越多,没必要浪费磁盘的空间。
Ecshop解决jQuery和toJSONString()的冲突的办法 php中的匿名函数和闭包函数以及use的用法