tp5遍历图片文件文件夹删除多余图片
未知
2021-09-14 10:23:59
0

问题描述:

   在我们发布文章的时候会上传一些图片,有些图片上传后觉得不好,就删除后重新上传一张图片。但是删除的那张图片却存入了服务器中,这样日久天长服务器里面的无用图片就越来越多。
   我写的这个办法针对写文章配图时的上传目录。通过固定的目录查找图片路径和数据库中body字段中img的src图片路径对比,如果目录中的图片路径没有在数据库src中找到就删除目录中的图片。

解决办法:

<?php


    namespace app\admin\controller;
    use think\Controller;
    use think\Db;
    class System extends Allow    {
        protected  $files;       

        public function doClearPic(){
            ini_set('max_execution_time',0);
            ini_set('memory_limit','256M'); //升级为256M内存
            $type=input('type');
            if($type==1){


                // 清理文章内容里面的图片
                $this->rFile(ROOT_PATH."public".DS."static/admin/image/editor");//调用,要遍历的目录
                array_pop($this->files);//删除数组中的最后一组元素

                $jpgfile = array_reduce($this->files, function ($jpgfile, $value) {
                      return array_merge($jpgfile, array_values($value));
                }, array());//把二维数组变成一维数组                

                //表articles里所有图片
                $articles = Db::name('articles')->where('body like "%<img %"')->column('body');              

                $pics = [];
                $reg = '/<img (.*?)+src=[\'"](.*?)[\'"]/i';
                foreach ($articles as $pic){
                    preg_match_all( $reg , $pic , $result );//匹配body中的img
                    $pics = array_merge_recursive($pics, $result[2]);//获取img中的src后把两个数组合并成一个数组

                }

                //循环数据库图片后添加绝对路径,替换成/,去掉//
                for ($i=0; $i < count($pics); $i++) {
                    $pics[$i]=ROOT_PATH.$pics[$i];
                    $pics_xiexian[$i]=str_replace("\\",'/', $pics[$i]);
                    $pics_xiexian[$i]=str_replace("//",'/', $pics_xiexian[$i]);

                }

               //循环图片文件,查询图片文件是否在数据库中的图片路径中
                for ($i=0; $i < count($jpgfile); $i++) {

                    $xiexian=str_replace("\\",'/', $jpgfile[$i]);
                    // 如果图片文件路径不在数据库图片路径数组中就删除图片
                    if(!in_array($xiexian, $pics_xiexian)){
                        unlink($jpgfile[$i]);
                    }
                }
                return json(['code'=>1000,'msg'=>'清理成功','data'=>'']);

            }

        }

        //目录中的图片循环获取图片路径数组
        public function rFile($p){
              global $file_a;
              $file_a=array();
              $handle=opendir($p);
              $dir_a=array();
              while ($file = readdir($handle)) {
                   if($file!="." && $file!=".."){
                    $tmp=$p."/".$file;
                    if(is_dir($tmp)){
                                       if(count(scandir($tmp))==2){//目录为空,=2是因为.和..存在
					      rmdir($tmp);// 删除空目录 
					     } 
                         $dir_a[count($dir_a)]=$tmp;
                    }elseif(is_file($tmp)){
                        $file_a[count($file_a)]=$tmp;
                    }

                   }

              }

              closedir($handle);
              foreach($dir_a as $v){
                   $this->rFile($v);
              }

              $this->files[]= $file_a;
        }
    }

?>

相关内容

小米汽车:经查完全不存在网...
小米汽车回应SU7“断轴”传闻,经查完全不存在。官方迅速澄清,强调...
2025-02-10 06:23:39
Webshell在网络攻击...
本文介绍了Webshell的概念、危害及传播途径,提出了包括加强安...
2025-02-09 21:00:40
WAF在网络安全防护中的角...
摘要: 随着互联网发展,网络安全问题突出。Web应用防火墙(WA...
2025-02-09 19:23:38
网络攻击中WAF技术的最新...
摘要: 本文探讨了WAF技术的最新发展和应用趋势,包括深度学习、...
2025-02-09 18:46:39
网络防御武器:WAF技术在...
WAF技术是网络安全领域的重要一环,能实时检测并拦截恶意请求和有害...
2025-02-09 18:00:40
upload_max_fi...
`upload_max_filesize` 是 PHP 中限制文件...
2025-02-09 16:46:42

热门资讯

Laravel 5.5 .No... 创建了新的laravel项目后, 运行提示:No application encryption ke...
生成随机字符唯一标识符guid... /** * @param $length * @return string * 生成随机字符串 */...
tp5 jquery判断手机端... application--common.php中添加如下代码 //函数作用是判断用户打开的是手机端还...
php 打印date函数出现错... 问题描述: 我使用的是phpstudy,在练习时间函数的时候,打印出现在的时间,date(Y-m-d...
Laravel 查看SQL操作... 方法一:临时打印操作记录 DB::connection()-enableQueryLog(); # ...
php函数substr_rep... php函数substr_replace从某个位置替换或删除或插入字符串
layui缩略图 div class=layui-form-item label class=layui-form-l...
object json转化为数... //调用api 程序,通知商户订单异常 20200314 public function callt...
php银行开放平台接口:pfx... 问题描述: 对接易通银行,他们的服务开放平台是java开发,而我的是php,现在需要php版本的SD...
Laravel 引入自定义类库... 强烈建议引入的类 都是含有命名空间的,这样使用起来就不会出现重名的情况。!!当然,没有命名空间也可以...