参考:@黑夜路人
一般我们都是按照文件扩展名来判断文件类型,但是这个很不靠谱,轻易就通过修改扩展名来躲避了,一般必须要读取文件信息来识别。
<?php $files = array('./test.jpg', 'test.png'); $fileTypes = array( 7790 => 'exe', 7784 => 'midi', 8075 => 'zip', 8297 => 'rar', 225216 => 'jpg', 7173 => 'gif', 6677 => 'bmp', 13780 => 'png', ); foreach($files as $file) { $fp = fopen($file, 'rb'); $bin = fread($fp, 2); // 只读头两个字节 fclose($fp); $strInfo = @unpack("C2chars", $bin); $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); $fileType = isset($fileTypes[$typeCode]) ? $fileTypes[$typeCode] : 'unknown'; echo $file , ' type : <b>', $fileType, '</b> code : <b>', $fileType, '</b><br />'; }
注:文件名扩展
Linux不使用文件名扩展来识别文件的类型。相反,Linux根据文件的头内容来识别其类型。为了提高人类可读性您仍可以使用文件名扩展,但这对 Linux 系统来说没有任何作用。不过,有一些应用程序,比如 Web 服务器,可能使用命名约定来识别文件类型,但这只是特定的应用程序的要求而不是 Linux 系统本身的要求。
Linux通过文件访问权限来判断文件是否为可执行文件。任何一个文件都可以赋予可执行权限,这样程序和脚本的创建者或管理员可以将它们识别为可执行文件。这样做有利于安全。保存到系统上的可执行的文件不能自动执行,这样就可以防止许多脚本病毒。
Linux环境中可以使用命令file可以使你知道某个文件究竟是ELF格式的可执行文件,还是shell script格式的文件或是其他的格式,命令使用格式如:# file startx。