php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件



<?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响应将其下载到客户端。注意,为了安全起见,在生产环境中,你可能还需要考虑添加更多的错误处理和安全性检查,比如验证文件是否存在于服务器上,以及避免路径遍历等安全问题。此外,如果处理大文件或目录,可能还需要考虑内存和性能问题。