我如何在不知道扩展名的情况下检查文件是否已被归档(zip或rar),我需要使用PHP来查找它。
由于文件信息(Fileinfo)未安装,而且服务器上安装其他任何软件包都是不可能的,因此我无法使用该方法。
更新:
Zip模块未安装,我不能安装额外的软件包。 我不想使用mime_content_type因为它已被弃用。
谢谢
我如何在不知道扩展名的情况下检查文件是否已被归档(zip或rar),我需要使用PHP来查找它。
由于文件信息(Fileinfo)未安装,而且服务器上安装其他任何软件包都是不可能的,因此我无法使用该方法。
更新:
Zip模块未安装,我不能安装额外的软件包。 我不想使用mime_content_type因为它已被弃用。
谢谢
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$
unzip -v yadda.odt
查看里面的内容。如果您想正确地识别 ZIP 文件的内容,则需要查看前五个字节以外的内容。 - ghoti要测试一个文件是否为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
}
elseif(($rar = RarArchive::open($filename)) !== FALSE)
{
$rar->close();
//this is a rar archive
}
else
{
//this is not a zip or rar archive
}
如果存档文件受密码保护,您可能需要做一些额外的工作。阅读相应的 PHP 手册页面以获取更多详细信息。
fileinfo 函数应该可以帮助您完成此操作,通过检查文件的 MIME 类型:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, $filename); // This will return the mime-type
finfo_close($finfo);
读取文件的前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存档。 干杯
<?php
function isZipFile($filepath){
$fh = fopen($filepath,'r');
$bytes = fread($fh,4);
fclose($fh);
return ('504b0304' === bin2hex($bytes));
}
感谢flu提供的有关zip文件规范的有用链接。