<?php
// 设置文件路径和压缩文件名称
$filesToZip = ['file1.txt', 'file2.jpg', 'directory/file3.pdf']; // 要打包的文件列表,可以是文件或目录
$zipFilePath = 'download.zip'; // 生成的zip文件路径
$downloadFileName = 'downloaded_files.zip'; // 下载时显示的文件名
// 创建ZipArchive实例
$zip = new ZipArchive();
// 打开压缩文件用于写入
if ($zip->open($zipFilePath, ZipArchive::CREATE) !== TRUE) {
exit("cannot open <$zipFilePath>\n");
}
// 遍历文件列表,添加到zip中
foreach ($filesToZip as $file) {
if (is_dir($file)) {
// 如果是目录,则添加整个目录
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($file), RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($files as $name => $object) {
// 跳过"."和".."目录
if (!$object->isDir()) {
$filePath = $name;
// 替换成相对于$file的路径
$relativePath = substr($filePath, strlen($file) + ($file[strlen($file) - 1] == '/' ? 0 : 1));
$zip->addFile($filePath, $relativePath);
}
}
} else {
// 如果是文件,直接添加
$zip->addFile($file, basename($file));
}
}
// 关闭zip文件
$zip->close();
// 设置文件头信息,以文件形式下载
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . $downloadFileName . '"');
header('Content-Length: ' . filesize($zipFilePath));
// 读取文件并输出到浏览器
readfile($zipFilePath);
// 可选:删除zip文件(如果需要)
// unlink($zipFilePath);
?>
这段PHP代码实现了使用ZipArchive类将指定的文件或目录打包成一个zip文件,并通过HTTP响应将其下载到客户端。注意,为了安全起见,在生产环境中,你可能还需要考虑添加更多的错误处理和安全性检查,比如验证文件是否存在于服务器上,以及避免路径遍历等安全问题。此外,如果处理大文件或目录,可能还需要考虑内存和性能问题。