使用php检查文件是否存档(zip或rar)

时间:2012-02-01 15:41:29

标签: php

如何在不知道扩展名的情况下检查文件是否已存档(zip或rar)。我需要使用php找到它。

我无法使用Fileinfo,因为它没有安装并且在服务器上安装任何其他软件包是不可能的。

更新:

Zip模块未安装,我无法安装额外的包。 我不想使用mime_content_type,因为它已被弃用

谢谢

6 个答案:

答案 0 :(得分:11)

od -c的输出:

  0000000    R   a   r   ! 032  \a  \0 317 220   s  \0  \0  \r  \0  \0  \0

  0000000    P   K 003 004  \n  \0  \0  \0  \0  \0  \0  \0   !  \0  \0  \0

您可以使用以下内容:

<?php

$fh = @fopen($argv[1], "r");

if (!$fh) {
  print "ERROR: couldn't open file.\n";
  exit(126);
}

$blob = fgets($fh, 5);

fclose($fh);

if (strpos($blob, 'Rar') !== false) {
  print "Looks like a Rar.\n";
} else
if (strpos($blob, 'PK') !== false) {
  print "Looks like a ZIP.\n";
} else {
  print "I dunno.\n";
  exit(1);
}

?>

我的输出:

ghoti@baz:~ 423$ ./filephp.php A2.rar
Looks like a Rar.
ghoti@baz:~ 424$ ./filephp.php OLDIE.zip 
Looks like a ZIP.
ghoti@baz:~ 425$ ./filephp.php 1-11-1.PDF 
I dunno.
ghoti@baz:~ 426$ 

答案 1 :(得分:4)

要测试文件是否为zip存档,您可以尝试使用open_zip功能将其作为zip打开。对于rar,您需要安装PECL rar(最好是版本至少2.0.0) - 有关详细信息,请参阅http://php.net/manual/en/book.rar.php。代码可能如下所示:

if(is_resource($zip = zip_open($filename))
{
    zip_close($zip);
    //this is a zip archive
}
else(($rar = RarArchive::open($filename)) !== FALSE)
{
    $rar->close();
    //this is a rar archive
}
else
{
    //this is not a zip or rar archive
}

如果存档受密码保护,您可能需要做一些额外的工作。阅读相应的php手册页以获取更多详细信息。

答案 2 :(得分:1)

fileinfo函数可以通过检查文件的mime类型来帮助你解决这个问题:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, $filename); // This will return the mime-type
finfo_close($finfo);

答案 3 :(得分:1)

您可以从unix file命令输出信息并解析它(假设您可以执行系统命令,这是不好的做法)。

这是centos“file filename ”输出的示例。

  

[rr @ localhost images](master)#file ui-anim_basic_16x16.gif   ui-anim_basic_16x16.gif:GIF图像数据,版本89a,16 x 16

     

[rr @ localhost images](master)#file ui-icons_454545_256x240.png   ui-icons_454545_256x240.png:PNG图像数据,256 x 240,8位色彩图,非隔行扫描

     

[rr @ localhost供应商](主)#file jquery-validation-1.9.0.zip   jquery-validation-1.9.0.zip:Zip归档数据,至少要提取v1.0

也像其他人建议的那样,您可以读取几个字节并检查它们是否与签名匹配。

表示rar

  

识别字符Hex:52 61 72 21 1A 07 00,ASCII:Rar!

for zip

  

识别字符Hex:50 4B 03 04,ASCII:PK

答案 4 :(得分:1)

读取文件的前10个字节。如果它们是(80,75,3,4,20,0,0,0,0,0),则它是ZIP文件。 RAR文件具有以下7个第一个字节:(82,97,114,33,26,7,0) 如果您在文本编辑器中打开ZIP文件(例如,Notepad ++),您将看到: PK [ETX] [EOT] [DC4] [NUL] [NUL] [NUL] [BS] [NUL] ....-&GT;上面列出了字符的Ascii代码。 对于RAR文件,图片是: RAR![SUB] [BEL] [NUL] ... 因此,只需读取文件的10个第一个字节,就可以判断它是ZIP还是RAR存档。 干杯

答案 5 :(得分:0)

<?php

function isZipFile($filepath){
    $fh = fopen($filepath,'r');
    $bytes = fread($fh,4);
    fclose($fh);
    return ('504b0304' === bin2hex($bytes));
}

感谢flu提供了有关zip文件规范的有用链接。