• 记php移动并压缩多级目录文件为zip文件并上传oss


    话不多说 上代码 实测好用

        public function goods_zip(){
            $goods_id = input('goods_id');
            $root_path = Env::get('root_path').'public';
            $goodszipInfo = db('goods_zipimg')->where('goods_id',$goods_id)->find();
            
     
            // 处理首图
            $fileName = $goods_id.'.png';
            $path_up = $root_path.'/'.$goodszipInfo['goods_thumb'];
            $path_to = $root_path.'/zip_img/'.$goods_id.'/thumb/';
            $res =  copyFile($path_up,$path_to,$fileName);
    
            // 处理图组
            $goods_imgs = explode(',',$goodszipInfo['goods_imgs']);
            foreach($goods_imgs as $k=>$v){
                $fileName = 'imgs_'.($k+1).'.png';
                $path_up = $root_path.'/'.$v;
                $path_to = $root_path.'/zip_img/'.$goods_id.'/imgs/';    
                $res =  copyFile($path_up,$path_to,$fileName);
            }
            
            // 处理详情图
            $goods_imgs = explode(',',$goodszipInfo['goods_imgs']);
            foreach($goods_imgs as $k=>$v){
                $fileName = 'detail_'.($k+1).'.png';
                $path_up = $root_path.'/'.$v;
                $path_to = $root_path.'/zip_img/'.$goods_id.'/detail/';    
                $res =  copyFile($path_up,$path_to,$fileName);
            }        
            
            // 压缩文件并上传
            $zipimg_path = $root_path.'/zip_img/'.$goods_id.'/';
            $zipimg_path_to = $root_path.'/zip_img/'.$goods_id.'/';
    
            $zip_path = $zipimg_path.'zip_'.$goods_id.'.zip';
            $zip_name = 'zip_'.$goods_id.'.zip';
            if(file_exists($zip_path)){
                unlink($zip_path);
            }
            $res = $this->zip($zipimg_path,$zip_path);
    
            // 压缩成功上传阿里云oss
            if($res){
                $oss_zip =  OssUpload::sendzipimg($zip_path,$zip_name);
                if($oss_zip){
                    $his_goods_zip = db('goods')->where('goods_id',$goods_id)->value('goods_zip');
                    $res = db('goods')->where('goods_id',$goods_id)->update(['goods_zip'=>$oss_zip]);
                    if($res && $his_goods_zip)OssUpload::delimg($his_goods_zip);
                    $this->success('图片打包上传成功', 0);  
                }
            }      
            $this->success('失败', 0);  
        } 

    下面是压缩多级目录 方法   

    网上查了好多   不是压缩包显示目录太多  就是不能压缩多级目录  

        public function zip($dir_path, $zipName)
        { 
            $relationArr = array(
                $dir_path => array(
                    'originName' => $dir_path,
                    'is_dir' => true,
                    'children' => array()
                )
            );
            $this->modifiyFileName($dir_path, $relationArr[$dir_path]['children']);
            $key = array_keys($relationArr);
            $val = array_values($relationArr);
            $zip = new ipArchive;
            //ZIPARCHIVE::CREATE没有即是创建
            $zip->open($zipName,ipArchive::CREATE);
            $this->zipDir($key[0], '', $zip, $val[0]['children']);
            $zip->close();
            return true;
        }
        /**
         * [zipDir 给zip文件添加目录及文件]
         * @param  [type] $real_path   [根目录]
         * @param  [type] $zip_path    [压缩目录]
         * @param  [type] &$zip        [引入zip资源]
         * @param  [type] $relationArr [参数变量]
         * @return [type]              [description]
         */
        function zipDir($real_path, $zip_path, &$zip, $relationArr)
        {
            $sub_zip_path = empty($zip_path) ? '' : $zip_path . '/';
            if (is_dir($real_path)) {
                  foreach ($relationArr as $k => $v) {
                    if ($v['is_dir']) {  //是文件夹
                        $zip->addEmptyDir($sub_zip_path . $v['originName']);
                        $this->zipDir($real_path . '/' . $k, $sub_zip_path . $v['originName'], $zip, $v['children']);
                    } else { //不是文件夹
                        $zip->addFile($real_path . '/' . $k, $sub_zip_path . $k);
                    }
                }
            }
        }
        /**
         * [modifiyFileName 遍历目录下所有文件夹及文件]
         * @param  [type] $path         [需要压缩的目录路径]
         * @param  [type] &$relationArr [引入参数变量]
         * @return [type]               [无]
         */
        function modifiyFileName($path, &$relationArr){
            if (!is_dir($path) || !is_array($relationArr)) {
                return false;
            }
            if ($dh = opendir($path)) {
                $count = 0;
                while (($file = readdir($dh)) !== false) {
                    if(in_array($file,array('.', '..', null))) continue; //无效文件,重来
                    if (is_dir($path . '/' . $file)) {
                      $relationArr[$file] = array(
                        'originName' => iconv('GBK', 'UTF-8', $file),
                        'is_dir' => true,
                        'children' => array()
                      );
                      $this->modifiyFileName($path . '/' . $file, $relationArr[$file]['children']);
                    }else{
                      $relationArr[$file] = array(
                        'originName' => iconv('GBK', 'UTF-8', $file),
                        'is_dir' => false,
                        'children' => array()
                      );
                    }
                }
            }
        }



  • 相关阅读:
    概要设计
    JNI内存泄露
    Flash 与 JS 交互
    Lucene.net 实现全文搜索(转)
    自动打开登录游戏的代码
    Ajax,网站改版的一种方法
    IE6/IE7和Firefox对Div处理的差异(转)
    搜VC里找到的
    C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
    HTML特殊转义字符列表
  • 原文地址:https://www.cnblogs.com/liiu/p/13680130.html
Copyright © 2020-2023  润新知