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条评论