PHP中的ZIP压缩与解压

压缩

ZipArchive::open第二个参数说明:

  • ZipArchive::OVERWRITE
    总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。

  • ZipArchive::CREATE
    如果不存在则创建一个zip压缩包。

  • ZipArchive::EXCL
    如果压缩包已经存在,则出错。

  • ZipArchive::CHECKCONS
    对压缩包执行额外的一致性检查,如果失败则显示错误。

压缩单个文件

$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}
$zip->addFile('C:/1.txt', '1.txt'); //zip文件中的文件名为1.txt,如果忽略,则会多一个名为C:的文件夹
$flag = $zip->close();
echo $flag?'success':'fail';

压缩多个文件

$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}
$zip->addFile('C:/1.txt', '1.txt');
$zip->addFile('C:/2.txt', '2.txt');
$flag = $zip->close();
echo $flag?'success':'fail';

添加文件到压缩包

如果存在压缩包,则添加;若不存在,则新建

$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::CREATE);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}
$zip->addFile('C:/2.txt', 'folder/2.txt');
$flag = $zip->close();
echo $flag?'success':'fail';

压缩文件夹

/**
 * @param string $basePath         带/结尾
 * @param string $relativePath     不带/开头
 * @param ZipArchive $zip
 */
function zipFolder($basePath, $relativePath, ZipArchive $zip)
{
    $handler = opendir($basePath.$relativePath);  //打开当前文件夹
    while(($filename = readdir($handler))!==false){
        if($filename!='.' && $filename!='..'){
            if(is_dir($basePath.$relativePath.'/'.$filename))
                zipFolder($basePath, $relativePath.'/'.$filename, $zip);
            else
                $zip->addFile($basePath.$relativePath.'/'.$filename, $relativePath.'/'.$filename);
        }
    }
    closedir($handler);
}

$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}
zipFolder('C:/', 'test', $zip);        //压缩文件夹C:/test,并且压缩包以test文件夹开始
$flag = $zip->close();
echo $flag?'success':'fail';

该程序有一个问题,如果包含一个空的子文件夹,则会被忽略,如果需要可以通过$zip->addEmptyDir('folder');补充

添加其它类型文件

addEmptyDir, addFromString

$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}
$zip->addFile('C:/1.txt', '1.txt');
$zip->addEmptyDir('folder1');       //添加一个空文件夹
$zip->addFromString('string.txt', 'hello everyone, my name is ...');    //添加字符串文件
$flag = $zip->close();
echo $flag?'success':'fail';

addGlob

$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}
$options = ['add_path'=>'ttt/', 'remove_all_path'=>true];   //移除所有路径,并将路径设置为ttt
//添加符合通配符规则的文件
$zip->addGlob('C:/test/*.txt',0, $options);
$flag = $zip->close();
echo $flag?'success':'fail';

解压

解压整个文件

解压文件到文件夹C:/out/中

$zip = new ZipArchive();
$flag = $zip->open('C:/in.zip');
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}
$zip->extractTo('C:/out/');
$flag = $zip->close();
echo $flag?'success':'fail';

注意:该程序不支持中文

支持中文的解压缩

$zip = new ZipArchive();
$zipFilePath = 'C:/in.zip';
$flag = $zip->open($zipFilePath);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}

$outDir = "C:/out/";
for($i=0;$i<$zip->numFiles;$i++){
    $statInfo = $zip->statIndex($i);
//    print_r($statInfo);
    if(substr($statInfo['name'], strlen($statInfo['name'])-1)=='/'){
        mkdir($outDir.substr($statInfo['name'], 0, -1));
    }
    else{
        copy('zip://'.$zipFilePath.'#'.$statInfo['name'], $outDir.'/'.$statInfo['name']);
    }
}

$flag = $zip->close();
echo $flag?'success':'fail';

提取压缩包中指定的文件

使用上述例子中的$statInfo = $zip->statIndex($i);获得的$statInfo['name']进行过滤。

读取信息

$zip = new ZipArchive();
$zipFilePath = 'C:/in.zip';
$flag = $zip->open($zipFilePath);
if($flag!==true){
    echo "open error code: {$flag}\n";
    exit();
}

$outDir = "C:/out/";
for($i=0;$i<$zip->numFiles;$i++){
    $statInfo = $zip->statIndex($i);
    print_r($statInfo);
}

$flag = $zip->close();
echo $flag?'success':'fail';

备注

ZipArchive::open返回值

如果打开成功则返回true,否则返回错误码,一下错误码表。

  • ZipArchive::ER_EXISTS
    文件已存在

  • ZipArchive::ER_INCONS
    zip archive前后不一致

  • ZipArchive::ER_INVAL
    参数不合法

  • ZipArchive::ER_MEMORY
    malloc失败

  • ZipArchive::ER_NOENT
    没有这个文件

  • ZipArchive::ER_NOZIP
    不是一个zip archive

  • ZipArchive::ER_OPEN
    无法打开文件

  • ZipArchive::ER_READ
    读取失败

  • ZipArchive::ER_SEEK
    seek失败

参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值