2

我需要通过检查二进制数据来找到用户上传了什么样的文件,我找到了完美的解决方案,在这里

具体来说,这是我正在使用的功能:

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等...如果那里有某种列表,那就太好了,尽管我想自己提取它并了解所有这些作品。

4

3 回答 3

4

您要查找的内容称为文件幻数

幻数是一种文件签名——因为有时它需要比幻数更多的时间来识别文件。

可以在此处找到此类数字的(非常​​)简短列表。可以在此处找到更大的列表。

文件识别网站也经常提到文件幻数。

在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.
于 2012-11-22T19:29:14.107 回答
3

您要查找的内容称为“文件签名”、“魔术字节”或“魔术数字”。

此页面列出了许多文件格式的许多文件

但是,我不会依赖它们来识别文件格式。请改用PHP 的 finfo_file

于 2012-11-22T19:29:10.877 回答
2

大多数文件都有一个特定的标题文件签名或(显然)幻数,它们是同一事物的不同名称:文件开头的一组固定字节。

例如,.exe 以 'MZ' 开头.zip 具有固定的 4 字节序列

该网页包含大量文件签名: http ://www.garykessler.net/library/file_sigs.html

如果您搜索.extension file formator .extension file header,您通常会找到文件格式的描述。

于 2012-11-22T19:25:11.817 回答