无法创建并下载public_html外临时目录的Zip文件求助
解决PHP Zip压缩包创建与下载失败问题
核心问题分析及修复步骤
文件路径错误:循环中你去掉了文件路径的
../tmp/前缀,导致ZipArchive::addFile()找不到源文件,无法向压缩包添加内容,甚至直接创建失败。
修复:直接将完整路径存入$file_names数组:while ($stmt->fetch()) { $dir = '../tmp/file-'.$nom.'.pdf'; $file_names[] = $dir; // 保留完整路径 $i++; }临时目录权限不足:
/tmp/目录需要PHP进程具备读写权限,否则无法创建Zip文件或写入内容。
修复:检查并设置/tmp/目录权限为755(共享主机环境可尝试775),确保PHP运行用户对该目录有读写权限。下载响应头文件名错误:你在
Content-disposition头中使用了完整路径作为文件名,浏览器会显示混乱的路径字符串,还可能引发路径解析问题。
修复:仅保留文件名部分:header('Content-disposition: attachment; filename='.basename($archive_file_name));空结果判断逻辑缺陷:原代码依赖最后一次循环的
$dir变量判断是否执行压缩逻辑,若查询结果为空,$dir未定义会触发警告,且逻辑不成立。
修复:改为判断$file_names数组是否非空:if (!empty($file_names))
修正后的完整代码
$i=0; $file_names = []; // 初始化数组,避免未定义警告 while ($stmt->fetch()) { $dir = '../tmp/file-'.$nom.'.pdf'; $file_names[] = $dir; $i++; } $stmt->close(); if (!empty($file_names)) { $archive_file_name = '../tmp/files.zip'; $zip = new ZipArchive(); if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE)!==TRUE) { exit("cannot open <$archive_file_name>"); } foreach($file_names as $files) { // 确认文件存在再添加,避免无效操作 if(file_exists($files)){ $zip->addFile($files, basename($files)); } } $zip->close(); ob_clean(); if (file_exists($archive_file_name)) { header("Content-type: application/zip"); header('Content-disposition: attachment; filename='.basename($archive_file_name)); header("Content-length: " . filesize($archive_file_name)); header("Pragma: no-cache"); header("Expires: 0"); readfile($archive_file_name); } else { exit("Could not find Zip file to download"); } }
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

