当我试图打开我的PHP Zip文件生成的zip文件时,显示一个警报
但是我可以通过7-zip打开文件。 由于某些原因,我必须确保压缩文件可以通过Windows资源pipe理器打开。 当我生成压缩文件时是否有任何问题? 请帮忙!
function create_a_zip($files = array(),$dest = '',$root_folder,$overwrite = false) { if(file_exists($dest) && !$overwrite) { return false; } $valid_files = array(); if(is_array($files)) { foreach($files as $file) { if(file_exists($file)) { $valid_files[] = $file; } } } if(count($valid_files)) { $zip = new ZipArchive(); if($zip->open($dest,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { return false; } foreach($valid_files as $valid_file) { if(is_dir($valid_file) === true){ foreach(glob($valid_file . '/*') as $file){ $zip->addFile($file, $root_folder . $file); } }else if (is_file($valid_file) === true){ $zip->addFile($valid_file, $root_folder . $valid_file); } } $zip->close(); return file_exists($dest); } else { return false; } }
对我来说,解决的办法是在输出zip文件内容之前使用ob_end_clean()
(正如@Ywis在注释中所指出的那样)…
ob_end_clean(); readfile($zipfilename); // outputs zip file's content
即使你以前没有输出任何字符
我认为这个问题来源于:
$zip->addFile($file,$file);
除非你的php脚本和你要添加到zip的文件在同一个目录下,否则你需要包含文件路径。 addFile中的第二个参数是zip文件中的文件的名称,所以如果你的$ file var包含路径,这就是问题可能来自哪里。 尝试将代码更改为:
$filenameonly = preg_replace("/(.*)\/?([^\/]+)/","$2",$file); $zip->addFile($file,$filenameonly );
这将删除文件路径(如果有的话),并只留下addFile中第二个变量的文件名。
如果这能解决您的问题,您将确定知道问题出在您的文件名中,并可以轻松找到它。
只需发送作为参数绝对路径例如$abspath
。 然后用它来
$filenameonly = str_replace($abspath,"",$file); $zip->addFile($file, $filenameonly);
它甚至可以在Windows 8中运行100%,甚至你压缩的文件都在文件夹中。
而不是使用str_replace字符串函数,您可以使用内置的文件系统函数。
$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME));