如何在不知道扩展名的情况下检查文件是否已存档(zip或rar)。我需要使用php找到它。
我无法使用Fileinfo,因为它没有安装并且在服务器上安装任何其他软件包是不可能的。
更新:
Zip模块未安装,我无法安装额外的包。 我不想使用mime_content_type,因为它已被弃用
谢谢
答案 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文件规范的有用链接。