2012-11-22 86 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