本文使用PHP自带扩展类“ZipArchive”。该类需要PHP版本在5.2以上。如没有开启扩展需要到php.ini文件搜索“zip”,把前面的“;”号删除掉。然后复制“php_zip.dll”到指定文件夹下(Windows?System32?)。
PS:在使用自带扩展类进行压缩包操作时,如需要选择根目录,建议不要直接使用“/”,而是使用“./”代替。
open:打开压缩包,所以压缩包操作需要基于这个方法
$zip = new ZipArchive();
$zip->open('asds.zip', $flags);
$flags:打开压缩包的处理方式,共有四种方法情况
ZipArchive::OVERWRITE
总是创建一个新的文件,如果指定的zip文件存在,则会覆盖掉
ZipArchive::CREATE
如果指定的zip文件不存在,则新建一个
ZipArchive::EXCL
如果指定的zip文件存在,则会报错
ZipArchive::CHECKCONS
在正式使用时可以根据情况将“$flags”替换成上面的代码,也可以选择不填,如下:
if($zip->open('123.zip', ZIPARCHIVE::CREATE)===true){
$zip->addEmptyDir('tmp222');
$zip->close();
}
addEmptyDir:在指定压缩包内添加一个文件目录
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->addEmptyDir('asdqqq');
}
addFile:将文件添加到指定zip压缩包中
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->addFile('./Public/Uploads/zip/123.zip');
}
这个方法在使用中,如果直接添加的话,会按照文件的路径在压缩包中新建文件夹,以达到和添加文件一样的路径。如果想要将指定文件添加到压缩包中指定的目录,如下:
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->addFile('./Public/Uploads/zip/123.zip', '456.zip');
}
以上代码会把路径为“./Public/Uploads/zip/123.zip”添加到压缩包根目录并命名为“456.zip”。
addFromString:添加的文件同时将内容添加进去
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->addFromString('3.txt', 'this is 3.txt<a href="asdas">asda</a>');
}
PS:在添加文件的时候可以随意填写路径,不用在另外执行新建文件夹的方法,因为这个方法会根据文件路径自动新建文件夹。如下:
$zip->addFromString('/tmp/3.txt', 'this is 3.txt<a href="asdas">asda</a>');
extractTo:将压缩包解压到指定目录
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->extractTo('./asdqqq/wwww');
}
如果想要指定加压缩文件,如下:
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->extractTo('./asdqqq/wwww', array('1.jpg', '2.jpg'));
}
PS:直接填写目录会加压缩到指定目录,如果没有这个目录则会新建这个目录。
deleteIndex:删除压缩包中的指定下标的文件,如:deleteIndex(0)删除第一个文件
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->deleteIndex(2);
}
deleteName:删除压缩包中指定文件/文件夹
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->deleteName('Public/Uploads/zip/123.zip');
}
PS:删除成功后,假如改路径下的所有文件夹都没有文件了,那么会自动删除这个路径的文件夹。
如果想要手动删除文件夹,则需确保这个文件夹下没有文件,且只能删除一层,多层嵌套的文件夹路径需要进行多次手动删除。删除文件夹代码如下:
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->deleteName('Public/Uploads/');
}
getStatusString:返回压缩时的状态内容,包括错误信息,压缩信息等等
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
echo $zip->getStatusString();
}
close:关闭ziparchive
$zip = new ZipArchive();
if($zip->open('asds.zip')===true){
$zip->addEmptyDir('tmp222');
$zip->close();
}
PS:看上去效果没有变化,但是每次使用这个压缩包扩展类在打开和完成操作后都应该执行关闭接口。
参考资料:
https://www.php230.com/1408406401.html
https://www.lvtao.net/dev/php_zip.html
https://www.cnblogs.com/hongfei/archive/2012/06/12/2546881.html