2012-02-01 126 views
11

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

我无法使用Fileinfo,因为它没有安装并且在服务器上安装任何其他软件包而无法正常工作。

更新:

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

谢谢

+0

mime_content_type但它的弃用和Fileinfo其未安装在服务器上,我无法安装它。 – keepwalking 2012-02-01 15:45:06

+1

$ zip = zip_open($ file); if(is_resource($ zip)){//它的zip} else {//它的非zip |}但是对于rar我不确定 – 2012-02-01 15:45:26

+1

你应该在你的问题中提到这个,这样你就不会得到建议使用'Fileinfo'的答案。显然,你提供的信息越多,你会得到更好的答案。 – 2012-02-01 15:46:17

回答

9

输出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); 
} 

?> 

而我的输出:

[email protected]:~ 423$ ./filephp.php A2.rar 
Looks like a Rar. 
[email protected]:~ 424$ ./filephp.php OLDIE.zip 
Looks like a ZIP. 
[email protected]:~ 425$ ./filephp.php 1-11-1.PDF 
I dunno. 
[email protected]:~ 426$ 
+2

'=== 0'似乎更合适 – hakre 2012-02-01 17:08:51

+0

感谢您的详细答案 – keepwalking 2012-02-01 18:45:09

+0

感谢您的答案,鱼! – liljoshu 2017-04-20 23:14:38

4

要测试一个文件是否是一个zip压缩包,你可以尝试打开它使用open_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手册页面以获取更多详细信息。

+0

顺便说一句,如果 – shadi 2016-06-17 09:11:37

+0

的Btw缺少pantheses另外,如果文件大小为零,这将返回'这是一个zip'。使用'if(filesize($ zipfile)== 0)返回false;'返回'这不是一个zip' – shadi 2016-06-17 18:21:20

+1

您的代码易受ZIP炸弹攻击。 – 2017-05-20 15:07:21

1

fileinfo功能来帮助你完成这个,通过检查文件的MIME类型:

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

在某些系统上,这往往会导致Office 2007+文档(DOCX,XLSX,PPTX)失败,因此手动检查是不可避免的。 – flu 2013-09-03 09:50:32

1

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

这是centos“文件文件名称”输出的示例。

[RR @本地图像](主)#文件UI-anim_basic_16x16.gif UI-anim_basic_16x16.gif:GIF图像数据,版本89A,16×16

[RR @本地图像](主站)#文件UI-icons_454545_256x240.png UI-icons_454545_256x240.png:PNG图像数据,256×240,8-位的颜色表,非隔行扫描

[RR @本地供应商](主)#文件jquery的验证-1.9.0.zip jquery-validation-1.9.0.zip:Zip档案资料,至少要提取v1.0

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

对RAR

识别字符十六进制:52 61 72 21 1A 07 00,ASCII:的RAR!

用于拉链

识别字符十六进制:50 4B 03 04,ASCII:PK

1

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

+2

如果问题是关于检查它的PHP,我不知道什么记事本++或任何文本编辑器相关的解决方案帮助.. – Tom 2012-11-01 18:54:39

+2

你应该只检查“\ x50 \ x4b \ x03 \ x04”的前4个字节,因为它们是PKZip文件的唯一签名。例如,第5和第6个字节表示提取所需的PKZip版本(在您的示例2.0中),可能会有所不同。请参阅:[ZIP文件的结构](https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html#localheader) – flu 2013-09-03 09:48:09

相关问题