【PHP8.x】FILEINFO_RAW定数の使い方
FILEINFO_RAW定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
FILEINFO_RAW定数は、PHPのファイル情報取得を扱うfileinfo拡張機能において、ファイル情報の出力形式を制御するために用いられる定数です。
この定数をfinfo_open()関数やfinfo_set_flags()メソッドの引数として指定することで、ファイルのMIMEタイプやエンコーディングといった情報が、整形されずに生の形式で返されるようになります。
通常、fileinfo拡張機能はファイルの種類を識別し、人間が読みやすい標準的な形式(例: image/jpegやtext/plain; charset=us-ascii)に加工して結果を返します。しかし、FILEINFO_RAW定数を設定すると、拡張機能が内部で識別したMIMEタイプなどの情報が、より加工されていない、そのままの状態で提供されます。
これは、特定のファイルタイプ検出の内部的な詳細を確認したい場合や、取得した情報を他のシステムでさらに細かく加工する必要がある場合など、整形前のデータが求められる場面で特に有用です。生の情報を直接扱うことで、より柔軟な処理が可能となります。システムエンジニアの初心者の方にとっては、ファイルの種類をプログラムで正確に識別し、その情報を適切に利用する際に、この定数が提供する出力形式の特性を理解することが重要です。
構文(syntax)
1echo FILEINFO_RAW;
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
FILEINFO_RAW定数は、ファイルの内容をそのままのバイナリ形式で取得するためのオプションを示す整数値です。
サンプルコード
PHP Fileinfo: FILEINFO_RAWとMIMEタイプ比較
1<?php 2 3/** 4 * FILEINFO_RAW 定数を使用した場合と、一般的なMIMEタイプ取得の場合を比較する関数。 5 * 6 * PHPのfileinfo拡張機能は、ファイルのMIMEタイプやその他の情報を検出するために使われます。 7 * FILEINFO_RAW は、Magicデータベースから読み込んだ生の文字列を返します。 8 * これは必ずしも標準的なMIMEタイプ形式ではない場合があります。 9 * 10 * @param string $filePath 分析するファイルのパス 11 */ 12function compareFileinfoOptions(string $filePath): void 13{ 14 echo "--- ファイル情報取得オプション比較 ---" . PHP_EOL; 15 echo "分析対象ファイル: " . $filePath . PHP_EOL . PHP_EOL; 16 17 // 1. 一般的なMIMEタイプを取得 (FILEINFO_MIME_TYPE オプション) 18 // 通常、ファイルの種類をMIMEタイプ形式 (例: "text/plain", "image/png") で取得したい場合に用います。 19 // finfo_open() は新しいファイル情報リソースを作成します。 20 $finfoMime = finfo_open(FILEINFO_MIME_TYPE); 21 if ($finfoMime === false) { 22 echo "エラー: finfo_open() (FILEINFO_MIME_TYPE) に失敗しました。" . PHP_EOL; 23 echo "PHPのfileinfo拡張機能が有効になっているか確認してください。" . PHP_EOL; 24 return; 25 } 26 // finfo_file() は指定されたファイルに関する情報を返します。 27 $mimeType = finfo_file($finfoMime, $filePath); 28 echo "FILEINFO_MIME_TYPE オプションでの情報: " . ($mimeType !== false ? $mimeType : '取得失敗') . PHP_EOL; 29 // finfo_close() でファイル情報リソースを閉じ、メモリを解放します。 30 finfo_close($finfoMime); 31 32 echo PHP_EOL; 33 34 // 2. 生のMagicデータベース文字列を取得 (FILEINFO_RAW オプション) 35 // Magicデータベースに保存されているファイルの種類に関する「生の」情報をそのまま取得したい場合に用います。 36 // 結果は標準的なMIMEタイプ形式とは異なる場合があります。 37 $finfoRaw = finfo_open(FILEINFO_RAW); 38 if ($finfoRaw === false) { 39 echo "エラー: finfo_open() (FILEINFO_RAW) に失敗しました。" . PHP_EOL; 40 echo "PHPのfileinfo拡張機能が有効になっているか確認してください。" . PHP_EOL; 41 return; 42 } 43 $rawInfo = finfo_file($finfoRaw, $filePath); 44 echo "FILEINFO_RAW オプションでの情報: " . ($rawInfo !== false ? $rawInfo : '取得失敗') . PHP_EOL; 45 finfo_close($finfoRaw); 46 47 echo PHP_EOL; 48 echo "補足:" . PHP_EOL; 49 echo "この例のテキストファイルでは、FILEINFO_MIME_TYPE が 'text/plain' のような標準MIMEタイプを返すのに対し、" . PHP_EOL; 50 echo "FILEINFO_RAW は 'ASCII text' のようなMagicデータベースの生の記述を返すことがあります。" . PHP_EOL; 51 echo "画像やその他の複雑なファイルタイプでは、この違いがさらに顕著になることがあります。" . PHP_EOL; 52} 53 54// --- スクリプト実行部 --- 55 56// テスト用に一時的なテキストファイルを作成します。 57$testFileName = 'temp_fileinfo_raw_example.txt'; 58file_put_contents($testFileName, 'このファイルはFILEINFO_RAW定数の動作確認用テキストです。'); 59 60// 作成したファイルに対して、情報取得関数を呼び出します。 61compareFileinfoOptions($testFileName); 62 63// テスト用ファイルを削除してクリーンアップします。 64if (file_exists($testFileName)) { 65 unlink($testFileName); 66 echo PHP_EOL . "一時ファイル '" . $testFileName . "' を削除しました。" . PHP_EOL; 67} 68 69?>
PHPのFILEINFO_RAWは、ファイルの情報を取得するfileinfo拡張機能で利用される定数です。この定数自体は引数を持たず、整数型(int)の値として定義されており、finfo_open()関数のオプションとして使用します。
FILEINFO_RAWをfinfo_open()に渡してファイル情報を取得すると、ファイルの種類を識別するための「Magicデータベース」に保存されている、加工されていない生の文字列情報が返されます。これは一般的なMIMEタイプ(例: "text/plain", "image/png")とは異なり、より低レベルなファイル記述となる場合があります。例えば、テキストファイルに対してFILEINFO_MIME_TYPEオプションが"text/plain"を返すのに対し、FILEINFO_RAWは"ASCII text"のような表現を返すことがあります。
システムエンジニアとしてファイルの種類を判別する際には、通常は標準的なMIMEタイプを取得するオプションを使いますが、特定のツールやシステムがMagicデータベースの生の情報形式を要求する場合にFILEINFO_RAWが役立ちます。この定数は、ファイル情報取得の詳細な挙動を制御するためのフラグの一つとして機能します。
FILEINFO_RAW定数は、ファイルの標準的なMIMEタイプ形式ではなく、Magicデータベースから取得した「生の情報」を返します。そのため、Webブラウザでの表示制御や他のシステムとの連携など、一般的なMIMEタイプ(例:image/jpeg)を期待する場面では、FILEINFO_MIME_TYPEの使用を強く推奨します。FILEINFO_RAWは、より詳細なファイル内部の識別情報が必要な場合に限定して利用を検討してください。また、finfo_open関数がfalseを返す場合は、PHPのfileinfo拡張機能がサーバーで有効になっているか確認が必要です。リソースリークを防ぐため、finfo_openで取得したファイル情報リソースは、処理後に必ずfinfo_closeで解放してください。
PHP file_info 拡張機能で生のファイル情報を取得する
1<?php 2 3/** 4 * 指定されたファイルの生のファイル情報を取得します。 5 * 6 * FILEINFO_RAW 定数は、PHP の fileinfo 拡張機能で使用されるフラグの一つです。 7 * finfo_open() 関数にこのフラグを渡すと、ファイルのマジックデータベースが解釈した 8 * 「生 (raw)」のファイル情報(例: マジックバイトの直接の値)が返されます。 9 * これは、MIME タイプ(例: text/plain, image/jpeg)のような、より高レベルで 10 * 解釈された情報とは異なる場合があります。 11 * 12 * @param string $filePath 情報を取得するファイルのパス。 13 * @return string ファイルの生のコンテンツタイプ、またはエラーメッセージ。 14 */ 15function getFileRawInfo(string $filePath): string 16{ 17 // finfo_open() でファイル情報データベースをオープンします。 18 // 第2引数に FILEINFO_RAW フラグを指定することで、生のファイル情報を取得するように指示します。 19 $finfo = finfo_open(FILEINFO_RAW); 20 21 // finfo_open() の初期化が失敗した場合は、エラーメッセージを返します。 22 if (!$finfo) { 23 return "エラー: finfo_open() の初期化に失敗しました。fileinfo 拡張機能が有効になっているか確認してください。\n"; 24 } 25 26 // finfo_file() を使用して、指定されたファイルの生の情報を取得します。 27 $rawInfo = finfo_file($finfo, $filePath); 28 29 // finfo_close() で開いたファイル情報データベースをクローズします。 30 finfo_close($finfo); 31 32 // 取得した情報が存在しない、または取得に失敗した場合はエラーメッセージを返します。 33 return $rawInfo ?: "エラー: ファイル情報の取得に失敗しました。ファイルが存在しないか、読み取り権限がありません。\n"; 34} 35 36// --- サンプル実行部分 --- 37 38// 1. テスト用のテキストファイルを作成します。 39$testTextFileName = 'example_text.txt'; 40file_put_contents($testTextFileName, 'これはPHPのFILEINFO_RAW定数の動作を確認するためのテキストファイルです。'); 41 42// 2. 作成したテキストファイルに対して FILEINFO_RAW を使って情報を取得し、結果を表示します。 43echo "ファイル: '{$testTextFileName}'\n"; 44echo "FILEINFO_RAW による情報: " . getFileRawInfo($testTextFileName) . "\n\n"; 45 46// 3. 別のテスト用ファイル(例えば、画像ファイルのふりをする)を作成します。 47// マジックバイトの仕組みを学ぶと、拡張子だけでなくファイル内容も重要だと分かります。 48$testImageFileName = 'example_image.png'; 49// 実際のPNGのマジックバイトは '\x89PNG\r\n\x1a\n' で始まりますが、ここでは単純なテキストを入れます。 50// この場合、fileinfo は拡張子ではなく内容に基づいて判断しようとします。 51file_put_contents($testImageFileName, 'これは画像ファイルではありませんが、拡張子は.pngです。'); 52 53// 4. 作成した画像ファイル(のふりをするファイル)に対して情報を取得し、結果を表示します。 54echo "ファイル: '{$testImageFileName}'\n"; 55echo "FILEINFO_RAW による情報: " . getFileRawInfo($testImageFileName) . "\n\n"; 56 57// 5. 存在しないファイルに対して情報を取得しようとした場合のエラーメッセージを確認します。 58$nonExistentFile = 'non_existent_file.xyz'; 59echo "ファイル: '{$nonExistentFile}'\n"; 60echo "FILEINFO_RAW による情報: " . getFileRawInfo($nonExistentFile) . "\n\n"; 61 62// --- 後処理 --- 63// サンプル実行のために作成したテストファイルを削除します。 64@unlink($testTextFileName); 65@unlink($testImageFileName); 66 67?>
PHP 8のFILEINFO_RAW定数は、ファイルの情報を取得するfileinfo拡張機能で利用される特別なフラグです。この定数をfinfo_open()関数と組み合わせて使用すると、ファイルの内容からマジックバイトのような「生の」情報が直接返されます。これは、一般的なMIMEタイプ(例: text/plainやimage/jpeg)のように解釈された情報とは異なり、より詳細な低レベルのデータが提供される点が特徴です。
サンプルコードのgetFileRawInfo関数は、引数としてファイルパス($filePath)を受け取ります。この関数は、FILEINFO_RAWフラグを使ってファイル情報データベースを初期化し、指定されたファイルから生のコンテンツタイプを取得します。処理が成功した場合はファイルの生のコンテンツタイプを示す文字列を返し、ファイルが見つからない、読み取り権限がない、またはfileinfo拡張機能の初期化に失敗した場合は、それぞれのエラーメッセージを文字列として返します。このコードは、異なるファイルタイプや存在しないファイルに対してFILEINFO_RAWがどのような情報を返すかを示しており、拡張子に惑わされずにファイル内容を解析する際の挙動を理解するのに役立ちます。
このサンプルコードを利用する際は、いくつかの重要な注意点があります。まず、finfo_open()関数はPHPのfileinfo拡張機能に依存しているため、PHP環境でこの拡張機能が有効になっていることを必ず確認してください。無効の場合、初期化に失敗しエラーを返します。次に、finfo_open()で開いたリソースは、処理が終わったらfinfo_close()関数で必ず閉じる必要があります。これを怠ると、システムリソースが消費され続け、パフォーマンスに影響を及ぼす可能性があります。また、FILEINFO_RAW定数は、MIMEタイプのような整形された情報ではなく、ファイルのマジックバイトに基づいた「生(raw)」の情報を取得しますので、期待する結果と異なる場合があります。最後に、指定するファイルパスが正しいこと、そしてPHPプロセスがそのファイルを読み取る権限を持っていることを確認してください。ファイルが存在しない場合や権限がない場合も、情報の取得に失敗しますので、適切なエラーハンドリングが不可欠です。