PHP ZipArchive正在运行,但现在创建无效的zip文件

时间:2018-01-17 18:00:49

标签: php zip ziparchive

我曾经能够用这个来创建动态zip文件:

if(isset($_POST['files'])) {
    $zip = new ZipArchive();
    $zip_name = $_POST['name'].".zip";
    if($zip->open($zip_name, ZIPARCHIVE::CREATE)===TRUE) { 
        foreach($_POST['files'] as $file){
            //here $file is like 'path/to/file.pdf' with no special characters in the name
            $name = basename($file);
            if(file_exists($file)){
                $zip->addFile($file, $name);
            }
        }
        $zip->close();
        if(file_exists($zip_name)) {
            header('Content-type: application/zip');
            header('Content-Disposition: attachment; filename="'.$zip_name.'"');
            readfile($zip_name);
            unlink($zip_name);
        }
    }
}

但是现在它创建了无效的zip文件。在Windows中你会收到一条错误消息,在Mac上你得到一个永无止境的zip文件循环。我已就其他问题(包括addFromSting方法)尝试了很多不同的建议,但我还没有找到解决方案。

感谢您

1 个答案:

答案 0 :(得分:0)

我添加clearstatcache();来帮助,以及header('Content-Length: ' . filesize($zip_name));进行仔细检查,生成的zip文件似乎总是合适的大小,无论包含哪些文件

我最后还是尝试了几件事,直到我偶然发现了一条线索。 file_exists()中的foreach始终是假的。在启动时,它看起来相对于域,但在某些地方它开始看起来相对于脚本所在的位置。所以我添加了一点点它并开始工作

if(file_exists($file)){
    $zip->addFile($file, $name);
} else if(file_exists('../../../'.$file)){
    $zip->addFile('../../../'.$file, $name);
}

仍然不知道为什么filesize()会起作用