函数
/**
* 压缩整个文件夹为zip文件
* 本地需要绝对路径,服务器需要相对路径
*/
function makeZipFile($zip_path = '', $folder_path = '') {
$rootPath = realpath($folder_path);
$zip = new ZipArchive();
// $zip->open($zip_path, ZipArchive::CREATE | ZipArchive::OVERWRITE);//这是压缩文件夹里面的文件
$zip->open($zip_path, ZipArchive::CREATE);//这是压缩目录
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file)
{
if (!$file->isDir())
{
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
}
应用方法
//为了避免下载混乱,这里说了一个下载记录的,以下是以下载记录ID来区分,每次压缩的内容
$downloadsID = 下载记录的ID;
//下载地址
$ExcelTmpDir = '压缩的主要目录地址';
$isCompress = 0;//是否需要压缩,1=需要:用户判断最后是否需要进压缩打包
$dataArr = array();//需要压缩的文件路径数据
//循环数据,创建对应的目录,以及复制对应的图片文件到需要的目录里面
foreach ($dataArr as $item)
{
//目录名称
$dirThemeName = '目录名称';
//先创建对应的目录
if(!is_dir($ExcelTmpDir.'/'.$downloadsID.'/'.$dirThemeName)){
$ret=mkdir($ExcelTmpDir.'/'.$downloadsID.'/'.$dirThemeName,0755,true);
if(!$ret)die('directory create faild!');
}
//再复制数据
if (这里可以判断文件是否存在等,根据自己的业务来判断)
{
$isCompress = 1;
$imgArr = array(文件路径数组);//本地为绝对路径,服务器为相对路径
foreach ($imgArr as $img)
{
$imgName = '';//获取文件名称
copy(substr($img,1),$ExcelTmpDir.'/'.$downloadsID.'/'.$dirThemeName.'/'.$imgName);//复制
}
}
}
//最后压缩打包
if ($isCompress)
{
//压缩文件路径
$zip_file = $ExcelTmpDir.'/'.$downloadsID.'/'.date('YmdHis').'.zip';
//需要压缩的文件夹路径
$zip_dir = $ExcelTmpDir.'/'.$downloadsID;
makeZipFile($zip_file,$zip_dir);
header("Location: /".$zip_file);
}
js下载
window.location = '压缩打包的应用方法接口地址'
以上为压缩打包并下载的整个流程,仅供参考学习。
解压
$zip = new ZipArchive();
$zipName = '压缩包路径及名称';
$extractPath = '解压到的目录';
if ($zip->open($zipName) === TRUE) {
// 解压ZIP文件
$zip->extractTo($extractPath);
// 关闭ZIP文件
$zip->close();
echo '成功';
} else {
echo '失败';
}