2012-11-22 84 views
2

我需要找到什麼樣的文件,用戶已經通過檢查二進制數據上傳,我發現那完美的解決方案,在here檢查二進制圖像數據

只要是特定的,這是我使用的功能:

function getImgType($filename) { 
    $handle = @fopen($filename, 'r'); 
    if (!$handle) 
     throw new Exception('File Open Error'); 

    $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS'); 
    $bytes = fgets($handle, 8); 
    $found = 'other'; 

    foreach ($types as $type => $header) { 
     if (strpos($bytes, $header) === 0) { 
      $found = $type; 
      break; 
     } 
    } 
    fclose($handle); 
    return $found; 
} 

現在的問題是,如何才能得到位的其他文件類型,如.zip, .exe, mp3, mp4等等......如果有某種列表的某處,這將是巨大的,但我想它提取我自己並瞭解所有這些如何真正起作用。

+2

您是否嘗試過用['finfo_file'(http://www.php.net/manual/en/function.finfo-file.php)?順便說一句,爲什麼你不使用這個函數var_dump zip,exe等字節......? – j0k

+0

[finfo_file(英文版)](http://www.php.net/manual/en/function.finfo-file.php) – GolezTrol

+0

它只支持'PHP> = 5.3.0'我希望支持情人版本也是如此。 – Linas

回答

3

你在找什麼叫file magic number

神奇的數字是文件簽名的類型 - 因爲有時花費比一個神奇的數字多來識別文件。

這樣的數字的(非常​​)很短的名單可以找到here。一個更大的列表可以找到here

文件標識網站通常也會提及文件的幻數。

在linux中,file命令可用於識別文件。 在PHP中,您可以使用FileInfo功能集來識別文件。


順便說一句,你沒有指定你想識別的文件的種類。有時,鑑定可能是錯誤的解決方案。例如,人們過去希望在將文件傳遞給GD或將其作爲圖像保存在服務器上之前識別文件。 在這種情況下,識別不是你的工作。相反,使用下面的代碼:

$data = file_get_contents('data.dat'); // File might eventcontain a JPG...it is 
             // still loaded without problems! 
$image = imagecreatefromstring($data); // ... since this function just needs the 
             // file's data, nothing more. 
+1

哇...我們的反應之間的4秒的差別! – Aziz

+0

嗯,它總是最好的答案,不是嗎? :) – Christian

+0

事實上,它是:) – Aziz

3

你在找什麼叫「文件簽名」,「魔術字節」,或「幻數」。

This page列出了很多他們的許多文件格式

不過,我不會依靠他們識別的文件格式。代替使用PHP's finfo_file