PHP -检查文件是否存档没有使用句柄资源


PHP - check if file is archived without using handle resource

是否有办法检查从远程服务器收到的内容是否为。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}

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

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

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

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

如果你在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 ]