php下zip打包目录,多级目录打包

利用php的扩展zip功能实现多层目录的打包,案例是多个不同位置的文件分目录打包成指定的文件。

效果:

微信截图_20200317130115.png

代码:

/**多级目录压缩
 * @param $openFile string 打开的目录
 * @param $zipObj object 实例化ZipArchive对象
 * @param $sourcePath string 源目录路径,绝对路径,如/user/bing/xxxx/
 * @param string $newRelat 相对目录的路径名称,如 image
 */
private static function createZip($openFile, $zipObj, $sourcePath, $newRelat = '')
{
    while (($file = readdir($openFile)) != false) {
        if ($file == "." || $file == "..")
            continue;

        /*源目录路径(绝对路径)*/
        $sourceTemp = $sourcePath . '/' . $file;
        /*目标目录路径(相对路径)*/
        $newTemp = $newRelat == '' ? $file : $newRelat . '/' . $file;
        if (is_dir($sourceTemp)) {
            $zipObj->addEmptyDir($newTemp);/*这里注意:php只需传递一个文件夹名称路径即可*/
            self::createZip(opendir($sourceTemp), $zipObj, $sourceTemp, $newTemp);
        }
        if (is_file($sourceTemp)) {
            $zipObj->addFile($sourceTemp, $newTemp);
        }
    }
}

/**打包下载
 * @param $params
 * @return array
 */
public static function action_pack($params)
{
    //基本的文件路径
    $controller_path =  'plugin/app/' . $params['plugin_tag'];
    $view_path =  'plugin/app_view/' . $params['plugin_tag'];
    $static_path =  'static/plugins/' . $params['plugin_tag'];
    
    //临时储存位置
    $temp_dir =  $params['user_id'] . '/pack_app/';
    if (!is_dir($temp_dir)) {
        if (! mkdir($temp_dir, 0777, true)){
            return  DataReturn('目录没有写入权限'.$temp_dir,-1);
        }
    }
    //最终目标
    $zipName = $temp_dir . $params['plugin_tag'] . '.zip';
    $zip = new \ZipArchive ();
    $zip->open($zipName, \ZipArchive::CREATE);
    if (is_dir($controller_path)){
        self::createZip(opendir($controller_path), $zip, $controller_path,'controller');
    }

    if (is_dir($view_path)){
        self::createZip(opendir($view_path), $zip, $view_path,'view');
    }

    if (is_dir($static_path)){
        self::createZip(opendir($static_path), $zip, $static_path,'static');
    }
    self::createZip(opendir($temp_dir), $zip, $temp_dir);
    $zip->close();

    
    if (is_file($zipName)){
        //todo 下载功能
    }
    return  DataReturn(3,-2);
}


评论/留言