2016-09-27 36 views
0

有没有办法检查从远程服务器接收的内容是否为.zip压缩文件?我在这里找到了很多解决方案,但都是针对本地文件的;因此,这些解决方案使用像fopen,fgets等文件句柄资源。PHP - 检查文件是否被归档而不使用句柄资源

简而言之,curl用于从远程服务器获取内容。根据远程服务器上的验证结果(我无权访问),它会以纯文本形式返回.zip压缩文件或错误消息。如果返回.zip文件,我从卷曲接收内容的样子:

然后,我只是用的fwrite函数写接收的内容到本地文件。当然,如果没有归档,内容如下:

some random message here 

这就是我所拥有的。那么,有没有办法检查返回的内容是否为.zip压缩文件?当然,我可以使用这样一个解决方案:

if (stristr($content, "some random message here")) {//not zip archive} 

但这是跛脚...

+3

如果您信任远程服务器,则可以依赖Content-Type标头。 –

+0

我想从我拥有的内容中获取标题是不可能的。我在问,因为我需要使用许多curl get/post请求,所以我使用了这样一个函数 - $ content = curl_get($ url,$ params),其中$ content是远程服务器返回的内容。否则,我想这将需要重写一些代码。 –

回答

1

一些研究之后,我发现了拉链的档案应以“PK”开始,所以我写了这样的代码(万一有人在今后类似的问题):

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

此代码是不是最大的选择(因为你需要信任的远程服务器),但总比没有好。我还添加了strlen函数来验证返回的内容“足够大”(超过100 KB)是一个zip压缩文件。

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

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 ] 
+0

谢谢。不幸的是,该脚本也在Windows机器上使用。 –