2

当我尝试打开由 PHP Zip Archive 生成​​的 zip 文件时,会显示一条警报

“Windows 无法打开文件夹。压缩(压缩)文件夹‘文件名’无效。” 在 Windows 资源管理器中打开错误。

但我可以通过 7-zip 打开文件。出于某种原因,我必须确保 zip 文件可以通过 Windows 资源管理器打开。生成 zip 文件时有什么问题吗?请帮忙!

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;
        }
    }
4

5 回答 5

12

对我来说,解决方案是ob_end_clean()在输出 zip 文件内容之前使用(正如@Ywis 在评论中指出的那样)......

ob_end_clean();
readfile($zipfilename); // outputs zip file's content

...即使您在此之前不输出任何字符。

于 2015-08-22T02:28:31.447 回答
1

我认为问题源于:

$zip->addFile($file,$file);

除非您的 php 脚本与要添加到 zip 的文件位于同一目录中,否则您将需要包含文件路径。addFile 中的第二个参数是 zip 中文件的名称,因此如果您的 $file var 包含路径,则问题可能来自于此。尝试将代码更改为:

$filenameonly = preg_replace("/(.*)\/?([^\/]+)/","$2",$file);
$zip->addFile($file,$filenameonly );

这将去掉文件路径(如果有的话),只留下 addFile 中第二个变量的文件名。

如果这能解决您的问题,您将确定问题出在您的文件名中,并且可以轻松查明问题。

于 2012-11-30T13:44:57.130 回答
0

例如,只需作为参数发送到绝对路径$abspath。然后用在

$filenameonly = str_replace($abspath,"",$file);
$zip->addFile($file, $filenameonly);

即使在 Window 8 中它也可以 100% 工作,甚至您压缩的文件也在文件夹中。

于 2013-05-09T16:13:41.793 回答
0

您可以使用内置文件系统函数,而不是使用 str_replace 字符串函数。

$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME));
于 2014-10-03T05:29:23.547 回答
0

Windows zip 无法识别以“/”开头的路径

只需删除文件路径中的第一个“/”。

像这样:

if ( substr($root_folder,0,1) == '/' ) {
    $root_folder = substr($root_folder,1);
}
$zip->addFile($file, $root_folder . $file);
于 2018-06-13T14:04:44.287 回答