PHP實現壓縮目錄zip


第一步:創建MakeZip類文件

<?php
class MakeZip{

    /**
     * description:主方法:生成壓縮包
     * @author: MY
     * @param $dir_path  想要壓縮的目錄:如 './demo/'
     * @param $zipName   壓縮后的文件名:如 './folder/demo.zip'
     * @return string
     */
    function zip($dir_path, $zipName)
    { 
        $relationArr = array(
            $dir_path => array(
                'originName' => $dir_path,
                'is_dir' => true,
                'children' => array()
            )
        );

        $key = array_keys($relationArr);
        $val = array_values($relationArr);

        $this->modifiyFileName($dir_path, $relationArr[$dir_path]['children']);
        $zip = new ZipArchive();
        //ZIPARCHIVE::CREATE沒有即是創建
        $zip->open($zipName, ZipArchive::CREATE);
        $this->zipDir($key[0], '', $zip, $val[0]['children']);
        $zip->close();
        $this->restoreFileName($key[0], $val[0]['children']);
        return true;
    }

    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);
                    $zip->deleteName($sub_zip_path . $v['originName']);
                    $zip->renameName($sub_zip_path . $k, $sub_zip_path . $v['originName']);
                }
            }
        }
    }

    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)) {
                    $newName = md5(rand(0, 99999) . rand(0, 99999) . rand(0, 99999) . microtime() . 'dir' . $count);
                    $relationArr[$newName] = array(
                        'originName' => iconv('GBK', 'UTF-8', $file),
                        'is_dir' => true,
                        'children' => array()
                    );
                    rename($path . '\\' . $file, $path . '\\' . $newName);
                    $this->modifiyFileName($path . '\\' . $newName, $relationArr[$newName]['children']);
                    $count++;
                } else {
                    $extension = strchr($file, '.');
                    $newName = md5(rand(0, 99999) . rand(0, 99999) . rand(0, 99999) . microtime() . 'file' . $count);
                    $relationArr[$newName . $extension] = array(
                        'originName' => iconv('GBK', 'UTF-8', $file),
                        'is_dir' => false,
                        'children' => array()
                    );
                    rename($path . '\\' . $file, $path . '\\' . $newName . $extension);
                    $count++;
                }
            }
        }
    }

    function restoreFileName($path, $relationArr)
    {
        foreach ($relationArr as $k => $v) {
            if (!empty($v['children'])) {
                $this->restoreFileName($path . '\\' . $k, $v['children']);
                rename($path . '\\' . $k, iconv('UTF-8', 'GBK', $path . '\\' . $v['originName']));
            } else {
                rename($path . '\\' . $k, iconv('UTF-8', 'GBK', $path . '\\' . $v['originName']));
            }
        }
    }
}

第二步:調用index.php文件

<?php
/**
 * 下面代碼實現把demo目錄壓縮成zip包,並以demo.zip為名稱存儲到folder目錄
 */
include_once "./MakeZip.class.php";
$makeZip = new MakeZip();
try{
    //重復壓縮,則會自動覆蓋
    $res = $makeZip->zip('./demo/','./folder/demo.zip');
    if(!$res){
        throw new Exception('壓縮失敗');
    }
    echo 'success';
}catch (Exception $e){
    echo $e->getMessage();
}

|--補充

MakeZip類文件中所實例化 ZipArchive類 需開啟PHP支持ZipArchive
在php.ini文件中將extension=php_zip.dll  開頭的;的去掉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM