方法一:pathinfo
代码示例:x
1 2 3 4 5 6 7 | /** * 获取文件后缀(如果文件名为11.11,11不是后缀,会默认11为后缀) * $file string 文件路径或者文件名 */ function get_extension( $file ){ return pathinfo ( $file , PATHINFO_EXTENSION); } |
说明: pathinfo具体使用方法,可以查看php手册。但是该方法仅仅只能根据文件后缀来判断文件类型,如果html后缀的文件,被修改成.php的后缀之后,读取到的则是php类型文件。
方法二:$_FILES
如果是php上传文件,则可以用$_FILES[‘uploadfile’][‘type’]来获取文件类型,但是同样会存在和pathinfo同样的问题,该方法仅仅只能根据文件后缀来判断文件类型。
方法三:php Fileinfo获取文件MIME类型(finfo_open)
代码示例:
1 2 3 4 5 6 | <?php $finfo = finfo_open(FILEINFO_MIME); // 返回 mime 类型 $filename = '.\Uploads\2.zip' ; var_dump(finfo_file( $finfo , $filename )); finfo_close( $finfo ); die ; |
说明: 如果文件存在则返回文件类型,否则返回false。该方法需要php5.3.0+版本。可以根据返回的结果来判断是什么类型的文件。该方法即便是原文件被改过后缀,已然可以读到原文件类型。
方法四:读取文件头六个字节作为判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <?php // 官方示例 function minimime( $fname ) { $fh = fopen ( $fname , 'rb' ); if ( $fh ) { $bytes6 = fread ( $fh ,6); fclose( $fh ); if ( $bytes6 ===false) return false; if ( substr ( $bytes6 ,0,3)== "\xff\xd8\xff" ) return 'image/jpeg' ; if ( $bytes6 == "\x89PNG\x0d\x0a" ) return 'image/png' ; if ( $bytes6 == "GIF87a" || $bytes6 == "GIF89a" ) return 'image/gif' ; return 'application/octet-stream' ; } return false; } // 将文件头4个字节转换成16进制判断 function fileType ( $filename ) { // 读取文件的前4个字节,根据硬编码判断 $file = fopen ( $filename , "rb" ); $strFile = fread ( $file , 4 ); //只读文件头4字节 fclose ( $file ); $strInfo = @unpack ( "C4chars" , $strFile ); //dechex(),把十进制转换为十六进制。 $code = dechex ( $strInfo [ 'chars1' ] ) . dechex ( $strInfo [ 'chars2' ] ) . dechex ( $strInfo [ 'chars3' ] ) . dechex ( $strInfo [ 'chars4' ] ); $type = '' ; switch ( $code ) //硬编码值查表 { case "504b34" : $type = 'application/zip; charset=binary' ; break ; case "89504e47" : $type = 'image/png; charset=binary' ; break ; default : $type = false; break ; } return $type ; } |
说明: 这个方法有缺陷,不同类型的文件,文件头4个字节可能会相同,并且部分文件类型表示文件类型的字符串,少于4个字节。可以考虑将方法三和方法四结合使用。