PHP Zip Archive - open或extractTo无法工作

6

我完全不知道为什么这个不起作用,请帮忙!

$archive = "x.zip";
$zip = new ZipArchive();
$res = $zip->open($archive);

if ($res === 'TRUE') {
    $unzip_success= $zip->extractTo('/temp/', "inscriptions.txt")

    $zip->close();
}
  • 目标目录 "temp" 的权限为 "0777"
  • 从 $res 获取的代码是 "11",而不是 PHP.net 文档所要求的 "TRUE"
  • 注意:必须将 $archive 的完整 URL 和 extractTo 的第一个参数放入

谢谢Hardik,对于任何感兴趣的人,我正在使用system("unzip x.zip inscriptions.txt -d temp");,它很有效。 - Lawrence DeSouza
8个回答

5

如果仍然无法解决问题,请检查您的服务器是否为Linux。如果是Linux,您可以通过PHP的system / exec函数运行unzip命令来解压缩文件。即

system("unzip archive.zip");

要提取特定文件,您可以查看unzip的man文档。由于服务器参数的原因,许多时候zip库无法按预期工作,在这种情况下,我会切换回Linux命令。


2

ZipArchive::extractTo 是大小写敏感的。如果要提取的文件名与压缩文件中的不完全匹配,该方法将返回 false。


2
问题在于您引用了关键字TRUE,应该不加单引号。另外,在从zip归档中提取文件之前,可以使用locateName检查文件是否存在。
$archive = "x.zip";
$zip = new ZipArchive();
$res = $zip->open($archive);

if ($res === true && $zip->locateName('inscriptions.txt') !== false) {
    $unzip_success= $zip->extractTo('/tmp/', "inscriptions.txt");

    $zip->close();
}

我去掉了引号,但是'11'仍然不等于TRUE,所以它仍然失败。我不认为它正在打开存档,但是对于11来说没有错误代码,所有的错误代码都以'ER_'开头。 - Lawrence DeSouza
实际上,错误代码11有一个名称为ZIPARCHIVE :: ER_OPEN的常量,其值为11,因此您可以看到:文件无法打开。在我的端上工作正常,它是否具有正确的权限? - Diego Agulló

2

我曾经遇到了同样的问题,不过我已经解决了 :) 使用 $_SERVER['DOCUMENT_ROOT'] 来获取URL。 我的代码(codeigniter):

$this->load->library('unzip');
$file = $this->input->GET('file');
$this->unzip->extract($_SERVER['DOCUMENT_ROOT'].'/TRAS/application/uploads/' .    $file,$_SERVER['DOCUMENT_ROOT'].'/TRAS/application/views/templates/' . $file);

1

添加文档根目录对我也有用。以下是我的代码

$zip = new ZipArchive;
        if ($zip->open($_SERVER['DOCUMENT_ROOT'].'/'.$folder.$file_path) === TRUE) {
            $zip->extractTo($_SERVER['DOCUMENT_ROOT'].'/$folder');
            $zip->close();
            echo 'ok';
        }

1
我遇到了同样的问题,但我可以打开zip文件,在打开后返回true
我的问题是在$zip->extractTo()之后得到了false。
在删除zip文件中命名为中文(非英文)的文件后,最终成功了。

1
如果$res等于11,那就意味着ZipArchive无法打开指定的文件。
为了测试这个问题:
$archive = "x.zip";
$zip = new ZipArchive();
$res = $zip->open($archive);

if($res == ZipArchive::ER_OPEN){
    echo "Unable to open $archive\n";
}

好的,我们知道错误代码是ER_OPEN,现在有什么建议为什么会出现这种情况呢?文件在那里,所有的zip文件不都是相同的吗? - Lawrence DeSouza
你确定你有读取该文件的权限吗?文件路径是否正确(它是否与脚本在同一目录中)?你能否创建另一个zip文件并进行测试?可能是任何数量的问题... - keithhatfield
1
我尝试将权限更改为0777,但没有起作用。在相同目录中使用另一个zip文件也不起作用,出现相同的错误。 - Lawrence DeSouza
2
在我刚刚进行的几次测试中,当文件不存在(或文件路径错误)或脚本无法读取文件时,我得到了错误11。 - keithhatfield
即使 $restrue,你的 if 语句也会为真。因为 var_dump(true == 11) 的结果是 true。你的 if 语句应该是 if ($res === ZipArchive::ER_OPEN) { - John Linhart

-2

我在Windows 10上遇到了同样的问题。我找到的唯一解决方案就是尝试两次extractTo,即使open()成功了:

$zip = new ZipArchive;
if ($open === true) {
    $result = $zip->extractTo($destination);
    if ($result === false) {
        $result = $zip->extractTo($destination);
    }
    $zip->close();
}

第二个extractTo()函数能够正常工作(没有任何干扰)似乎表明存档文件或目标目录没有问题。

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