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

时间:2013-07-06 03:43:04

标签: php zip

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

我正在尝试找到一种方法来检查每个ZIP文件以验证文件,并检查它是否已损坏或上传是否未完成。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:10)

with sums as (SELECT id_bus, sum(CASE WHEN depense.id_bus = 1 THEN depense.montant ELSE 0 END) AS NbrARRNP FROM depense group by id_bus) SELECT matricule, nom_ligne, Count(num_ticket) AS nbre_ticket, Sum(prix) AS moant, receveur, nom_gie, d.NbrARRNP AS tot, receveur, nom_gie FROM journal_recettes j left outer join sums d on j.id_bus = d.id_bus GROUP BY matricule, nom_ligne, receveur, nom_gie, j.id_bus 的结果也可以是open应首先评估。没有检查true,等于(int)1,永远匹配。

ZipArchive:ER_NOZIP

答案 1 :(得分:1)

您可以使用ZipArchive类。从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

答案 2 :(得分:1)

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

ZipArchive似乎无法检测到损坏的文件。 ZipArchive :: CHECKCONS没有帮助,只要它根本不是ZIP文件。它很高兴在我的测试中解压缩了损坏的文件,并且没有通知客户端下载数据。

创建用于测试的损坏存档很简单 - 压缩一些文件并在生成的ZIP文件中使用十六进制编辑器更改字节。现在,您可以使用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();
?>

如果文件不能在服务器上完全解压缩但由于其大小而在流式传输到客户端时解压缩,则文件传输已经启动并且稍后打印错误消息不起作用。也许最好的方法是在关闭文件传输之前中断连接。客户端应该能够将此检测为损坏的下载。 在服务器端需要一个函数,它可以逐步计算流数据的CRC32。