使用PHP提取Zip存档

时间:2012-03-09 17:04:50

标签: php zip

我要做的是基本上在我的服务器上提取Zip档案的内容。这是一些代码:

$entry="test.zip";

    $zip = new ZipArchive;

    if ($zip->open($entry,ZIPARCHIVE::OVERWRITE) === TRUE)
    {
        $zip->extractTo('unpacked');
        $zip->close();

     }else 
     {
        echo ‘failed’;

     }

目录“unpacked”对每个人都是可写的,ZipArchive类的所有使用方法都返回true。然而,没有提取任何东西。有没有人碰巧有什么可能导致这种行为?任何提示都将受到高度赞赏......提前致谢!

5 个答案:

答案 0 :(得分:2)

如果您使用的是PHP 5.2.0或更高版本,可以先检查zlib扩展名http://www.zlib.net/

您还检查了PECL扩展,为了访问ZipArchive,您还可以尝试使用zip_open,zip_read进行检查。

答案 1 :(得分:1)

如果失败,您应该回显$zip,因为它包含错误。 此外,我猜你可能没有test.zip所需的权限

答案 2 :(得分:1)

如果此代码是内部代码,并且您可以安全地假设您不会将此代码从Linux移动到Windows(反之亦然),您还可以选择执行本地系统命令,这可能会有所帮助解决你的问题。

<?php

echo `unzip myarchive.zip`; 
echo `tar -xzf myotherarchive.tar.gz`;

?>

在开发内部使用和/或维护脚本时,我曾经选择直接进行系统调用,因为它更符合系统管理员习惯使用的命令。

答案 3 :(得分:1)

如果您的zip存档很大,有时您无法在服务器允许的最长执行时间内提取所有文件。

唯一的解决方案是,如果你不能改变php.ini中的maximum_execution_time,那就是使用javascript来提取一个文件。在第一个javascript请求中,您获取存档中的文件数

$nbr_of_files = $zip->numFiles;

使用zip存档中每个文件的ID号

提取一个接一个文件后
$zip->extractTo('unpacked', array($zip->getNameIndex($file_nbr)));

答案 4 :(得分:0)

请尝试从ZipArchive open方法中删除ZIPARCHIVE :: OVERWRITE标志。 (如果您遵循其他答案中的建议,该标志可能无法按预期运行,可能是问题的根源。)