PHP的ZipArchive过去可以使用,但现在创建的zip文件无效。

3

我曾经能够使用以下代码创建动态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文件循环。我已经尝试了很多其他问题的不同建议(包括addFromString方法),但我没有找到解决方案。
谢谢。

这个以前能用吗?从来没改过什么?我对 foreach($_POST['files'] as $file)if(file_exists($file)) 感到好奇...你能包含一下这个脚本是如何开始的吗?比如使用了哪个表单。另外,你测试过之前能用的文件,它们现在还能用吗,还是现在失败了? - IncredibleHat
@IncredibleHat 没有改变。客户今天早上说它停止工作了。这是文件的开头,当页面上的按钮被点击时,将发送一个包含文件路径值的隐藏输入表单到页面。我测试了曾经工作的页面,还创建了一个静态文件路径数组来代替使用,但仍然失败。 - justin
1个回答

0

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

最终我尝试了更多的方法,直到偶然发现了一个线索。在foreach中的file_exists()始终为false。在启动时它会相对于域名查找,但在某个地方它开始相对于脚本所在位置查找。因此,我添加了一个小的异常处理程序,然后它就开始工作了。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接