php ZipArchive检查Zip文件是否损坏/不完整

php ZipArchive检查Zip文件是否损坏/不完整,php,zip,Php,Zip,我的用户通过FTP上传zip文件,然后php文件将它们添加到RSS文件中 我试图找到一种方法来检查每个ZIP文件,以验证该文件,并检查它是否损坏或上传是否未完成。有什么方法可以做到这一点吗?您可以使用该类来实现这一点。由于PHP5.2,它是标准php发行版的一部分 像这样使用它: $zip = new ZipArchive(); // ZipArchive::CHECKCONS will enforce additional consistency checks $res = $zip->

我的用户通过FTP上传zip文件,然后php文件将它们添加到RSS文件中

我试图找到一种方法来检查每个ZIP文件,以验证该文件,并检查它是否损坏或上传是否未完成。有什么方法可以做到这一点吗?

您可以使用该类来实现这一点。由于PHP5.2,它是标准php发行版的一部分

像这样使用它:

$zip = new ZipArchive();

// ZipArchive::CHECKCONS will enforce additional consistency checks
$res = $zip->open('test.zip', ZipArchive::CHECKCONS);
switch($res) {

    case ZipArchive::ER_NOZIP :
        die('not a zip archive');
    case ZipArchive::ER_INCONS :
        die('consistency check failed');
    case ZipArchive::ER_CRC :
        die('checksum failed');

    // ... check for the other types of errors listed in the manual
}

如果zip存档文件不完整或以其他方式被破坏
$zip->open()
将返回
ZipArchive::ER_NOZIP
打开的结果也可以是
true
,这应该首先计算。不检查
ZipArchive:ER_NOZIP
,它等于(int)1,永远匹配

$zip = new ZipArchive();
$res = $zip->open('test.zip', ZipArchive::CHECKCONS);
if ($res !== TRUE) {
    switch($res) {
        case ZipArchive::ER_NOZIP:
            die('not a zip archive');
        case ZipArchive::ER_INCONS :
            die('consistency check failed');
        case ZipArchive::ER_CRC :
            die('checksum failed');
        default:
            die('error ' . $res);
    }
}

如何检测CRC不匹配的损坏文件:

ZipArchive似乎无法检测损坏的文件。只有当它根本不是ZIP文件时,CHECKCONS才有帮助。在我的测试中,它愉快地解压了损坏的文件,下载数据的客户端没有得到通知

为测试创建损坏的存档非常简单-压缩一些文件,并在生成的压缩文件中使用十六进制编辑器更改一个字节。现在,您可以使用ZIP应用程序测试该文件,以了解归档文件中的哪个文件已损坏

您只需在服务器上验证较小文件的CRC:

<?php
$maxsize = 1024*1024;
$z = new ZipArchive;
$r = $z->open("foo.zip", ZipArchive::CHECKCONS);
if($r !== TRUE)
  die('ZIP error when trying to open "foo.zip": '.$r);

$stat = $z->statName("mybrokenfile.txt");
if($stat['size'] > $maxsize)
  die('File too large, decompression denied');
$s = $z->getStream($file);
$data = stream_get_contents($s, $maxsize);
fclose($s);
if($stat['crc'] != crc32($data))
  die('File is corrupt!');
//echo 'File is valid';

//you may send the file to the client now if you didn't output anything before
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="mybrokenfile.txt"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $stat['size']);
ob_clean();
echo $data;
$z->close();
?>

我已经知道如何检查它是否是一个zip存档,我想检查文件是否不完整或被破坏。如果存档被破坏
$zip->open()
将返回
ER\u-NOZIP
我刚刚测试过它,它总是打印“不是zip存档”即使使用有效的zip archiveYes进行测试,也会执行额外的一致性检查。我会在答案中加上这个。但是,即使没有此选项,示例也会发现损坏的存档,因为通常的一致性检查在默认情况下是启用的。(查看了siurce代码)。你目前的问题是什么?它没有检测到一些损坏的档案吗?这很好用。虽然它也会解压EXCEL和最不需要的类似文件。我得到的错误是:未定义的类常量'CHECKCONS'@h0tw1r3:从PHP5.3开始,这个扩展是内置的。以前,Windows用户需要在php.ini中启用php_zip.dll才能使用这些函数。CHECKCONS不会验证存档中的文件,只验证存档本身的一致性。