php怎麼獲取檔案型別(不通過字尾)

2022-01-10 19:01:37

獲取檔案型別的方法:1、使用「$_FILES['uploadfile']['type']」語句;2、使用「finfo_file(finfo_open(FILEINFO_MIME),檔案路徑)」語句;3、通過讀取檔案頭六個位元組來進行判斷。

本教學操作環境:windows7系統、PHP7.1版、DELL G3電腦

php獲取檔案型別(不通過字尾)

方法1:$_FILES

如果是php上傳檔案,則可以用$_FILES['uploadfile']['type']來獲取檔案型別,但是同樣會存在和pathinfo同樣的問題,該方法僅僅只能根據檔案字尾來判斷檔案型別。

方法2:php Fileinfo 獲取檔案MIME型別(finfo_open)

程式碼範例:

<?php
	$finfo = finfo_open(FILEINFO_MIME); // 返回 mime 型別
    $filename = '.\Uploads\2.zip';
    var_dump(finfo_file($finfo, $filename));
    finfo_close($finfo);
    die;

返回結果:

1.png

說明: 如果檔案存在則返回檔案型別,否則返回false。該方法需要php5.3.0+版本。可以根據返回的結果來判斷是什麼型別的檔案。該方法即便是原檔案被改過字尾,已然可以讀到原檔案型別。

方法3:讀取檔案頭六個位元組作為判斷

<?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個位元組。可以考慮將方法2和方法3結合使用。

檔案型別寫死值的對照表:http://www.garykessler.net/library/file_sigs.html
(對照表的英文大寫要改成小寫,第一個數位為0時要省略,eg:504B0304讀到的是504b34)

擴充套件知識:通過字尾獲取檔案型別

pathinfo方法

程式碼範例:

/** 
* 獲取檔案字尾(如果檔名為11.11,11不是字尾,會預設11為字尾)
* $file string 檔案路徑或者檔名
*/
function get_extension($file){
return pathinfo($file, PATHINFO_EXTENSION);

說明: pathinfo具體使用方法,可以檢視php手冊。但是該方法僅僅只能根據檔案字尾來判斷檔案型別,如果html字尾的檔案,被修改成.php的字尾之後,讀取到的則是php型別檔案。

推薦學習:《》

以上就是php怎麼獲取檔案型別(不通過字尾)的詳細內容,更多請關注TW511.COM其它相關文章!