php将文件夹打包zip文件,php ziparchive压缩文件夹时,Zip文件目录结构不对

public function addFileToZip($path, ZipArchive $zip, $sub_dir = ''){

$handler = opendir($path);

while (($filename = readdir($handler)) !== false)

{

if ($filename != "." && $filename != "..")

{

//文件夹文件名字为'.'和‘..’,不要对他们进行操作

if (is_dir($path . $filename))

{

$localPath = $sub_dir.$filename.'/'; //关键在这里,需要加上上一个递归的子目录

// 如果读取的某个对象是文件夹,则递归

$this->addFileToZip($path . $filename . '/', $zip, $localPath);

}

else

{

//将文件加入zip对象

$zip->addFile($path . $filename, $sub_dir . $filename );

//$sub_dir . $filename 这个参数是你打包成压缩文件的目录结构,可以调整这里的规则换成你想要存的目录

}

}

}

@closedir($path);

}

//调用的时候,

$zip = new ZipArchive(); //压缩文件

$needZipFile = '../../example';

$targetZipFile = 'targetZip.zip';

if ($zip->open($targetZipFile, ZipArchive::CREATE) === TRUE) {

$this->addFileToZip($needZipFile, $zip,'example/');

// ‘example/’这个参数要传,是你打包生成后的根目录名称,你可以随意换成你想要的目录名称

$zip->close(); //关闭处理的zip文件

}

//提供下载功能

$downname = "example.zip";

$fp = fopen($targetZipFile, "r");

$file_size = filesize($targetZipFile);//获取文件的字节

//下载文件需要用到的头

Header("Content-type: application/octet-stream");

Header("Accept-Ranges: bytes");

Header("Accept-Length:" . $file_size);

Header("Content-Disposition: attachment; filename=$downname");

$buffer = 1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)

$file_count = 0; //读取的总字节数

//向浏览器返回数据 如果下载完成就停止输出,如果未下载完成就一直在输出。根据文件的字节大小判断是否下载完成

while (!feof($fp) && $file_count < $file_size) {

$file_con = fread($fp, $buffer);

$file_count += $buffer;

echo $file_con;

}

fclose($fp);

//下载完成后删除压缩包,临时文件夹

if ($file_count >= $file_size) {

unlink($targetZipFile);

}

你可能感兴趣的:(php将文件夹打包zip文件)