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

あなたが探しているのはファイルマジックナンバーと呼ばれています。

マジックナンバーはファイル署名の一種です。ファイルを識別するのにマジックナンバーよりも多くの時間がかかる場合があるためです。

そのような番号の(非常に)短いリストはここにあります。より大きなリストはここにあります。

多くの場合、ファイル識別Webサイトには、ファイルのマジックナンバーについても言及されています。

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 バイト シーケンスです。

この Web ページには多くのファイル署名が含まれています: http://www.garykessler.net/library/file_sigs.html

.extension file formatまたはを検索.extension file headerすると、通常、ファイル形式の説明が見つかります。

于 2012-11-22T19:25:11.817 に答える