close
轉自 https://segmentfault.com/q/1010000010558345
--
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);
}
--
全站熱搜