php获取所有文件并压缩

/*
 *  压缩文件
 * */
function zip($files){
    $zipName = 'download.zip';
    $zip = new \ZipArchive;//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
    /*
     * 通过ZipArchive的对象处理zip文件
     * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
     * $zip->open这个方法第一个参数表示处理的zip文件名。
     * 这里重点说下第二个参数,它表示处理模式
     * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。
     * ZIPARCHIVE::CREATE 如果不存在则创建一个zip压缩包,若存在系统就会往原来的zip文件里添加内容。
     *
     * 这里不得不说一个大坑。
     * 我的应用场景是需要每次都是创建一个新的压缩包,如果之前存在,则直接覆盖,不要追加
     * so,根据官方文档和参考其他代码,$zip->open的第二个参数我应该用 ZipArchive::OVERWRITE
     * 问题来了,当这个压缩包不存在的时候,会报错:ZipArchive::addFile(): Invalid or uninitialized Zip object
     * 也就是说,通过我的测试发现,ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
     * 所以我的解决方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)
     *
     * 以上总结基于我当前的运行环境来说
     * */
    if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) {
        exit('无法打开文件,或者文件创建失败');
    }
    foreach($files as $val){
        //$attachfile = $attachmentDir . $val['filepath']; //获取原始文件路径
        if(file_exists($val)){
            //addFile函数首个参数如果带有路径,则压缩的文件里包含的是带有路径的文件压缩
            //若不希望带有路径,则需要该函数的第二个参数
            $zip->addFile($val, basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下
        }
    }
    $zip->close();//关闭
    if(!file_exists($zipName)){
        exit("无法找到文件"); //即使创建,仍有可能失败
    }
    return '打包成功';
}

/*
 *  获取文件的路径及名称
 * */
function traverse($path)
{
    global $filePath;//得到外部定义的数组
    $current_dir = opendir($path);    //opendir()返回一个目录句柄,失败返回false
    while (($file = readdir($current_dir)) !== false) {    //readdir()返回打开目录句柄中的一个条目
        $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
        if ($file == '.' || $file == '..') {
            continue;
        } else if (is_dir($sub_dir)) {    //如果是目录,进行递归
            traverse($sub_dir); //嵌套遍历子文件夹
        } else {    //如果是文件,直接输出路径和文件名
            $filePath[$path . '/' . $file] = $path . '/' . $file;//把文件路径赋值给数组
        }
    }
    return $filePath;
}

本文由 黑白世界4648 第一时间收藏到GET,原文来自 → my.oschina.net

「GetParty」

关注微信号,推送好文章

微信中长按图片即可关注

更多精选文章

评论
微博一键登入