这里就用到PHP的ZipArchive功能,为了备忘,赶紧记录下来。
首先你得确认你的PHP里有没有启用ZipArchive,通过php.ini设置,反正sham的默认打开了,所以没去劳心设置。
下面就直接开整,代码如下:
<?php
//文件夹打包
function addFileToZip($path, $zip) {
$handler = opendir($path); //打开当前文件夹由$path指定。
while (($filename = readdir($handler)) !== false) {
//文件夹文件名字为'.'和‘..’,不要对他们进行操作
if ($filename != "." && $filename != "..") {
$tempfile = $path . "/" . $filename;
// 如果读取的某个对象是文件夹,则递归
if (is_dir($tempfile)) {
addFileToZip($tempfile, $zip);
} else {
$zip->addFile($tempfile); //将文件加入zip对象
}
}
}
@closedir($path);
}
//删除文件和目录
function deldir($path){
//如果是目录则继续
if(is_dir($path)){
//扫描一个文件夹内的所有文件夹和文件并返回数组
$p = scandir($path);
//如果 $p 中有两个以上的元素则说明当前 $path 不为空
if(count($p)>2){
foreach($p as $val){
//排除目录中的.和..
if($val !="." && $val !=".."){
//如果是目录则递归子目录,继续操作
if(is_dir($path.$val)){
//子目录中操作删除文件夹和文件
deldir($path.$val.'/');
}else{
//如果是文件直接删除
unlink($path.$val);
}
}
}
}
}
//删除目录
return rmdir($path);
}
$zip = new ZipArchive();
$zipname = "ziptemp.zip"; //自行定义,也可使用动态参数
$filepath = "ziptemp/"; //自行定义,也可使用动态参数
//首先新建一个临时文件夹用于存储
if(file_exists($filepath)){
}else{
mkdir($filepath,0777);
}
try {
$zip->open($zipname, ZipArchive::CREATE);
//调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
addFileToZip($filepath, $zip);
//关闭处理的zip文件
$zip->close();
} catch (\Exception $exception) {
return $exception->getMessage();
}
//下载zip
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: " . filesize($zipname));
header("Content-Disposition: attachment; filename=\"" . basename($zipname) . "\"");
readfile($zipname);
deldir($filepath); //删除文件及文件夹,---慎重,别误删自己文件---
unlink($zipname); //下载后删除zip压缩包
exit;
?>
这样,稍微和其他结合,就能实现各种打包需求啦,比如sham和活动中用户提交清单里的下载功能结合,就把登记清单存为csv文件,然后因为看不到图片,就用这个来把图片一起打包下载,其中简单的通过判断字符串里是否包含图片后缀来判断是否为图片信息。
if(strpos($data,'jpg') || strpos($data,'png'))
唯一遗憾就是如果目录里有中文,好像该中文文件夹和里面的文件都不会被打包进去,尝试多次,尚未解决,待优化。
Last modification:December 14, 2023
© Allow specification reprint