PHP - 检查文件是否在不使用句柄资源的情况下存档

时间:2016-09-27 10:45:26

标签: php curl ziparchive

有没有办法检查从远程服务器收到的内容是否是.zip存档?我在这里找到了很多解决方案,但它们都是本地文件;因此,这些解决方案使用文件句柄资源,如fopen,fgets等。

简单地说,curl用于从远程服务器获取内容。根据远程服务器上的验证结果(我无权访问),它以纯文本形式返回.zip存档或错误消息。如果返回.zip存档,我从curl收到的内容如下:

PK
 A‘OCBÇ—= = 
 and many more symbols here....

然后我只使用fwrite函数将接收到的内容写入本地文件。当然,如果没有返回存档,内容如下:

some random message here

这就是我的全部。那么,有没有办法检查返回的内容是否是.zip存档?当然,我可以使用像:

这样的解决方案
if (stristr($content, "some random message here")) {//not zip archive}

但这很蹩脚......

2 个答案:

答案 0 :(得分:1)

经过一些研究,我发现zip档案应该以" PK"开头,所以我写了这样的代码(以防将来有人遇到类似的问题):

if (substr($content, 0, 2) == 'PK' && strlen($content)>100000) {echo "this is zip";}

这段代码不是最好的选择(因为你需要信任远程服务器),但它总比没有好。我还添加了strlen函数来验证返回的内容是否足够大" (超过100 KB)是一个zip存档。

如果有人有一个更好的解决方案,而不使用文件句柄资源,我会很高兴听到它。

答案 1 :(得分:1)

如果您使用的是Linux或* BSD服务器,则可以执行以下操作:

$result = shell_exec('file cccr_logo.zip');
echo 'result:['.$result.']';

哪个应该吐出这样的东西:

result:[cccr_logo.zip: Zip archive data, at least v2.0 to extract ]

如果您想针对标准$result进行测试,可以使用-b开关,如下所示:

$result = shell_exec('file -b cccr_logo.zip');
echo 'result:['.$result.']';

现在有效的zip将是(没有文件名):

result:[Zip archive data, at least v2.0 to extract ]