ECShop二次开发:对商品内容中的远程图片自动本地化
作者:我就是个世界
发表于:2012-03-25
ecshop商城系统后台的编辑器是fckeditor,想实现ecshop商品远程图片本地化,下面这种方法对于文章中外链图片不多的情况下适用!
远程图片本地方的好处:
1、避免远程图片失效时,自已网站的图片也无法查看
2、全自动,无需人工参与
此方法的缺点:
对于文章中图片过多或网络不好的话,可能导致下载超时,本地化图片失败。
下面介绍修改方法:[separator]
[color=#4169E1]
----------------------------------- 2012年3月31日 15:51:46 更新 ----------------------------------------------------
刚刚发现如果文章中有本站图片的话,下次编辑依会再采集处理一次,这是不对的,所以改了一下代码,增加了如下处理![/color]
[code]
$value = ereg_replace("http://".$_SERVER['SERVER_NAME']."/","/",$value);//将源文件进行替换, 如果远程图片为本站域名下的,则不做采集处理
[/code]
以上代码加在[code]$value = trim($value);[/code]下面!
[code]
function GetCurContent($goods_desc)
{
$ext = 'gif|jpg|jpeg|bmp|png';//罗列图片后缀从而实现多扩展名匹配
$body = stripslashes($goods_desc);
$img_array = array();
//$body = ereg_replace("HTTP://".$_SERVER['SERVER_NAME']."/","",$body);//将源文件进行替换
preg_match_all("/(src|SRC)=[\"|'| ]{0,}(http:\/\/(.*)\.($ext))/isU",$body,$img_array); //正则匹配图片
$img_array = array_unique($img_array[2]);
set_time_limit(0);
$imgurl = IMAGE_DIR."/".date('Ym')."/goods_desc_img";
$imgpath = ROOT_PATH.$imgurl;
$millisecond = date("YmdHms");
if (!file_exists($imgpath))
{
if (!make_dir($imgpath))
{
return false;
}
}
else
{
foreach($img_array as $key =>$value)
{
$value = trim($value);
$get_file = @file_get_contents($value);
$rndfilename = $imgpath."/".$millisecond.$key.".".substr($value,-3,3);
//$fileurl = "HTTP://".$_SERVER['SERVER_NAME']."/".$imgurl."/".$millisecond.$key.".".substr($value,-3,3);
$fileurl = "/".$imgurl."/".$millisecond.$key.".".substr($value,-3,3);
if($get_file)
{
$fp = @fopen($rndfilename,"w");
@fwrite($fp,$get_file);
@fclose($fp);
}
//echo $rndfilename."<br/>".$fileurl."<br/>".$value."<br/>";
$body = ereg_replace($value,$fileurl,$body); //正则表达式替换
}
}
$body = addslashes($body); //使用反斜线引用字符串,即使对插入的数据进行转义,防注入
//print_r($body);
//exit();
return $body;
}
[/code]
这是一个函数,可以直接放在后台/include/lib_goods.php中就可以了。或者直接放面/include/lib_common.php 或者直接放在admin/goods.php,均可执行。
调用方式:
在admin/goods.php中,把所有$_POST[goods_desc]改成" . GetCurContent($_POST[goods_desc]) ."
下载的图片路径在images/年月/goods_desc_img
此代码在ecshop2.7.3下测试通过! 其它的版本应该也没有问题!
_______________________________________________
参考文档:
ecshop远程图片本地化的另一种方法
http://ecshop.topit.cn/ecshop-tutorial/ecshop_tupian_bendihua_fangfa-120.html
php的ereg_replace()函数使用总结
http://hi.baidu.com/duanpengtao8/blog/item/91f82238a2ca68f215cecb9b.html
php中addslashes()函数的用途
http://zhidao.baidu.com/question/29857861.html
远程图片本地方的好处:
1、避免远程图片失效时,自已网站的图片也无法查看
2、全自动,无需人工参与
此方法的缺点:
对于文章中图片过多或网络不好的话,可能导致下载超时,本地化图片失败。
下面介绍修改方法:[separator]
[color=#4169E1]
----------------------------------- 2012年3月31日 15:51:46 更新 ----------------------------------------------------
刚刚发现如果文章中有本站图片的话,下次编辑依会再采集处理一次,这是不对的,所以改了一下代码,增加了如下处理![/color]
[code]
$value = ereg_replace("http://".$_SERVER['SERVER_NAME']."/","/",$value);//将源文件进行替换, 如果远程图片为本站域名下的,则不做采集处理
[/code]
以上代码加在[code]$value = trim($value);[/code]下面!
[code]
function GetCurContent($goods_desc)
{
$ext = 'gif|jpg|jpeg|bmp|png';//罗列图片后缀从而实现多扩展名匹配
$body = stripslashes($goods_desc);
$img_array = array();
//$body = ereg_replace("HTTP://".$_SERVER['SERVER_NAME']."/","",$body);//将源文件进行替换
preg_match_all("/(src|SRC)=[\"|'| ]{0,}(http:\/\/(.*)\.($ext))/isU",$body,$img_array); //正则匹配图片
$img_array = array_unique($img_array[2]);
set_time_limit(0);
$imgurl = IMAGE_DIR."/".date('Ym')."/goods_desc_img";
$imgpath = ROOT_PATH.$imgurl;
$millisecond = date("YmdHms");
if (!file_exists($imgpath))
{
if (!make_dir($imgpath))
{
return false;
}
}
else
{
foreach($img_array as $key =>$value)
{
$value = trim($value);
$get_file = @file_get_contents($value);
$rndfilename = $imgpath."/".$millisecond.$key.".".substr($value,-3,3);
//$fileurl = "HTTP://".$_SERVER['SERVER_NAME']."/".$imgurl."/".$millisecond.$key.".".substr($value,-3,3);
$fileurl = "/".$imgurl."/".$millisecond.$key.".".substr($value,-3,3);
if($get_file)
{
$fp = @fopen($rndfilename,"w");
@fwrite($fp,$get_file);
@fclose($fp);
}
//echo $rndfilename."<br/>".$fileurl."<br/>".$value."<br/>";
$body = ereg_replace($value,$fileurl,$body); //正则表达式替换
}
}
$body = addslashes($body); //使用反斜线引用字符串,即使对插入的数据进行转义,防注入
//print_r($body);
//exit();
return $body;
}
[/code]
这是一个函数,可以直接放在后台/include/lib_goods.php中就可以了。或者直接放面/include/lib_common.php 或者直接放在admin/goods.php,均可执行。
调用方式:
在admin/goods.php中,把所有$_POST[goods_desc]改成" . GetCurContent($_POST[goods_desc]) ."
下载的图片路径在images/年月/goods_desc_img
此代码在ecshop2.7.3下测试通过! 其它的版本应该也没有问题!
_______________________________________________
参考文档:
ecshop远程图片本地化的另一种方法
http://ecshop.topit.cn/ecshop-tutorial/ecshop_tupian_bendihua_fangfa-120.html
php的ereg_replace()函数使用总结
http://hi.baidu.com/duanpengtao8/blog/item/91f82238a2ca68f215cecb9b.html
php中addslashes()函数的用途
http://zhidao.baidu.com/question/29857861.html
已有1条评论