Ueditor删除无用图片详解

一、前言

      在上一篇文章 yii2.0使用ueditior完成上传单张,多张图片,上传视频等操作 之后,博主进行了大量的测试,偶然发现图片文件夹越来越大。。

      是的,比如上传了a.pngb.jpg,等到要提交的时候,又把a.png在编辑器中给删除了(backspace),此时我们获取的文档中只有b.jpg,但是存储图片文件夹中,a.png是依然存在的,此时它就是无用的图片。当我们添加的量多的时候,这些无用图片就十分烦人了,占用空间,而且看起来也心烦。

二、删除无用图片的逻辑

      首先,这部分无用图片我们是没有存储在数据库的,理论上来说呢,其实应该弄个临时的文件存储上传的图片,然后再弄个文件夹存储正式的图片。只是文件目录这种东西,特别是在开发的差不多的时候,能不动就不动最好。所以博主这边采用另一种方案,使用临时json数据存储图片名,根据对比来进行删除。

1、add逻辑

(1)图片上传的时候,图片名称存入到img.json
(2)提交表单的时候,获取contont,匹配content中图片的src部分,获取数组$add_img;
	
(3)遍历json文件,获取所有的图片名称,然后和$add_img做比较,获取到$add_img中没有的图片名称$del_img_arr
(4)遍历删除$del_img_arr,同时删除img_json文件。

2、edit逻辑

(1)编辑的提交的时候,同样获取一下content中的图片为add_img。然后获取json文件中的$json_arr,再获取数据库存储的的content中的$arr_img。
	(2)array_merge($json_arr,$arr_img)为$arr_img,然后执行的操作就和新增时候一样了,对比两个数组中的图片名,找到$add_img中没有的图片名,删除即可

OK,大致逻辑明确之后,接下来就是正式的代码部分

三、删除无用过程

1、通过正则匹配图片的src

  /**
     * @param $content
     * @params:根据html内容获取图片的src ,$type是为了区分add和edit,因为存在转义,所以截取的长度不同
     * @author:ljf
     * @date:2019/7/5
     * @time:16:03
     */
    public function getImgSrc($content,$type)
    {
        $add_img = [];
        $pattern='/<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/i';
        preg_match_all($pattern,$content,$res);
        if(count($res[1]) > 0){//代表匹配到图片了,截取字符串,获取图片名称即可
            foreach($res[1] as $v){
                if($type == 1) {
                    $src = substr($v, -21);
                    $img_name = substr($src, 0, strlen($src) - 1);
                }else{
                    $src = substr($v, -20);
                    $img_name = $src;
                }
                //$add_img[$img_name] = $img_name;
                $add_img[]=[
                    'name'=>$img_name,
                ];
            }
        }
        return $add_img;
    }

      这里的$type变量是博主业务需求加上去的,大家不加就行,主要是正则匹配,返回图片的src数组。

2、去Uploader.php中,找到上传图片的方法upFile(),修改上传成功之后的逻辑,即存入img.json文件。

  if (!(move_uploaded_file($file["tmp_name"], $path) && file_exists($path))) { //移动失败
            $this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE");
        } else { //移动成功,把图片名称写入json
            $path = \Yii::getAlias('@out_news');
            $path_img = $path."/img/img.json";
            $all_img = [];
            $data[] = [
                'name'=> substr($this->imgName,5),
            ];
            if(file_exists($path_img)){
                $json_string = file_get_contents($path_img);// 从文件中读取数据到PHP变量
                $arr_img = json_decode($json_string, true);// 把JSON字符串转成PHP数组
                if(count($arr_img) > 0){
                    $all_img = array_merge($arr_img,$data);
                }else{
                    $all_img = $data;
                }
            }else{
                $all_img = $data;
            }
            $img_all = json_encode($all_img,JSON_UNESCAPED_UNICODE);
            file_put_contents($path_img, $img_all);
            $this->stateInfo = $this->stateMap[0];
        }

3、edit的时候相关操作

      adddelete的操作比较简单,这里就不列出来了,具体是edit的时候,要对比传入的conten中的图片名称,以及数据库中和json文件中的图片名称,综合对比,删除文件夹中无用的图片。

  $path_img = $path."/img/img.json";  //json文件的路径
                    if(file_exists($path_img)) {
                        $json_string = file_get_contents($path_img);// 从文件中读取数据到PHP变量
                        $img_json_arr = json_decode($json_string, true);// 把JSON字符串转成PHP数组
                    }else{
                        $img_json_arr = [];
                    }
                    $old_img_src = $this->getImgSrc($arr[0]['string'],2);  // 获取数据库中的图片src数组
                    $new_img_src = $this->getImgSrc($content,1);  // 获取新传入的content的图片src数组
                    $old_img_src = array_merge($old_img_src,$img_json_arr);  //合并数据库和json文件的图片数组
                    	$this->delLocalImage(new_img_src ,old_img_src );  //删除操作
	

4、删除函数delLocalImage()

 /**
     * @param $arr_img
     * @param $add_img
     * @params:通过旧数组和新数组的对比,删除无用的图片,$add_img是每次提交的img,  $arr_img是json文件和数据库内存的img
     * @author:ljf
     * @date:2019/7/5
     * @time:16:16
     */
    public function delLocalImage($arr_img,$add_img = [])
    {
        $path = \Yii::getAlias('@out_news');
        $path_img = $path."/img/img.json";
        $new_img = [];
        if(count($arr_img)>0) {
            if(count($add_img) > 0){ //当内容中含有图片的时候,才做判断,不含图片的话,直接删除json文件中的img
                foreach($add_img as $k2=>$v2){
                    $new_img[$v2['name']] = $v2['name'];
                }
                unset($v2);
                foreach ($arr_img as $k => $v) {
                    if (isset($new_img[$v['name']])) {
                        unset($arr_img[$k]);
                    }
                }
            }
            unset($v);
            if(count($arr_img) > 0) {
                foreach ($arr_img as $k1 => $v1) {
                    $del_path = $path . '/img/' . $v1['name'];
  	 if(file_exists($del_path )){
                    $this->delDirAndFile($del_path, false);
	 }
                }
            }

        }
        $this->delDirAndFile($path_img, false); //删除掉json文件
    }

关于删除文件夹的函数代码,参考:
php删除文件夹(临时文件)代码

四、总结

1、 测试的时候一定要细心,既然是做自己的产品,尽量是不要留下什么小尾巴,其实这些无用图片不管也没事,对性能不会造成太大的影响,但是如果明知道是程序有问题还不改,那就是自己的失职了。

2、 以上思路是建立在不改变原项目目录的情况下,如果想要方便点的话,直接新建测试文件夹存储这些临时图片也是不错的,反正就是对比,删除的事情。

3、 记录这篇博客主要是心里有点感慨。最开始的时候,遇到bug都是直接开始撸代码,遇到问题了再去思考。现在呢,总是喜欢现在笔记本上写思路,先列出来大致思路,一直到形成一个闭环为止。然后对这些思路进行删减,看看能不能优化下,是否有更好的解决方案,最后才会敲定最终方案,按照思路去写代码,事半功倍是真的。

      看来我们都在不知不觉的发生着改变,是好事吧,逐渐变得成熟且强大。只是,莽劲儿却少了许多,可能就是传说中的姜花深处无少年吧。

end

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值