第一步:创建MakeZip类文件
<?phpclass 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 开头的;的去掉。
PHP实现压缩目录zip
原文地址:https://www.cnblogs.com/lonmyblog/p/9366749.html