PHP 图片的冗余处理
in php with 0 comment

PHP 图片的冗余处理

in php with 0 comment

这几天玩《侠客风云传》上了瘾+天气炎热懒癌发作,一个文章模块拖了快一周终于在今天解决掉了。说实话并没有难点,只是往复在2个处理方案的抉择。最后还是用了以前wantsget的设计。

操作流程

1.在图片上传接口用SESSION记录收到的图片
2.提交时用正则取出所有的图片链接-->去除引用的外部图片链接
3.使用array_diff()对比session和文章中的图片,差集则为上传之后未使用的图片,删除该部分即可


    // 获取文章中的所有图片
    preg_match_all('/(<\s*img[^>]+)src\s*=\s*"([^"]+)"([^>]+>)/i', $article['content'], $photos);
    //重新排序,过滤站外图片
    $temp = [];
    foreach($photos[2] as $k=>$v) {
        if(strpos($v, 'http') !== false){
            continue;
        }else{
            $temp[] = $v;
        }
    }

    //读取图片上传记录 对比 文章中的图片,取出上传了且未用到的图片
    if(isset($temp)){
        $del_array=array_diff($_SESSION['article_photos'],$temp);//对比出要删除的图片
        foreach($del_array as $img){
            //删除操作...
        }
    }
    
    //文章中没有图片 却存在上传记录,则删除上传记录中的图片
    if(!isset($temp) or count($temp) == 0 && isset($_SESSION['article_photos'])){
        foreach($_SESSION['article_photos'] as $img){
            //删除操作...
        }
    }

关于array_diff():
1.注意比较的顺序,如果上例的$_SESSION['article_photos']和$temp调换了位置,就存在删除任意目录文件的漏洞。因为他比较的结果是A数组在B数组中不存在的值(比如A=1,2,3, B=1,3,4,5,) 那么结果就是2,而不会包含4,5。(具体函数用法自行百度)
2.推荐删除文件时对文件格式做一次后缀名检查,只允许删除掉图片格式的文件。

Comments are closed.