【PHP8.x】finfo::file()メソッドの使い方
fileメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『fileメソッドは、指定されたファイルの内容を調べて、そのMIMEタイプなどの情報を文字列として取得するために実行するメソッドです。このメソッドは、finfoクラスのインスタンスを生成した後に使用します。例えば、new finfo(FILEINFO_MIME_TYPE) のようにインスタンスを作成し、そのインスタンスに対して file() メソッドを呼び出すことで、ファイルのMIMEタイプ(例: 'image/jpeg' や 'application/pdf')を取得できます。第一引数には、調査したいファイルのパスを文字列で指定します。第二引数には、FILEINFO_MIME_ENCODING のような定数を指定することで、MIMEエンコーディング情報など、取得する情報の種類を変更することも可能です。処理が成功した場合は要求された情報が文字列として返され、ファイルが存在しないなどの理由で失敗した場合は false が返されます。このメソッドは、ファイルの拡張子ではなく、ファイル内部のデータ(マジックバイト)を直接解析して種類を判定するため、より信頼性の高いファイル形式の検証が可能です。そのため、ユーザーからのファイルアップロード機能などで、意図しない形式のファイルが送信されるのを防ぐセキュリティ対策として広く利用されています。』
構文(syntax)
1<?php 2$finfo = new finfo(FILEINFO_MIME_TYPE); 3 4$filename = 'path/to/your-file.txt'; 5 6// 成功した場合はMIMEタイプ(string)、失敗した場合は false が返ります 7$result = $finfo->file($filename); 8 9var_dump($result); 10?>
引数(parameters)
string $filename, int $flags = FILEINFO_NONE, ?resource $context = null
- string $filename: ファイルのパスを指定する文字列
- int $flags = FILEINFO_NONE: ファイル情報の取得方法を指定する整数。デフォルトはFILEINFO_NONE(標準的な取得)
- ?resource $context = null: ファイル操作のコンテキストを指定するリソース。省略可能
戻り値(return)
string|false
指定されたファイルの情報(MIMEタイプ)を文字列で返します。ファイルの情報取得に失敗した場合は false を返します。
サンプルコード
PHPでファイル存在確認とMIMEタイプ取得
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ファイルが存在するかを確認し、存在すればそのMIMEタイプを返す関数 7 * 8 * @param string $filename ファイルへのパス 9 * @return void 10 */ 11function printMimeType(string $filename): void 12{ 13 // file_exists() を使って、ファイルまたはディレクトリの存在を確認します。 14 if (file_exists($filename) && is_file($filename)) { 15 echo "ファイル '{$filename}' が見つかりました。" . PHP_EOL; 16 17 // finfo クラスのインスタンスを生成します。 18 // FILEINFO_MIME_TYPE は、MIMEタイプを文字列で返すよう指定する定数です。 19 $finfo = new finfo(FILEINFO_MIME_TYPE); 20 21 // finfo::file() メソッドで、指定したファイルのMIMEタイプを取得します。 22 // 取得に失敗した場合は false が返ります。 23 $mimeType = $finfo->file($filename); 24 25 if ($mimeType !== false) { 26 echo "MIMEタイプ: " . $mimeType . PHP_EOL; 27 } else { 28 echo "MIMEタイプの取得に失敗しました。" . PHP_EOL; 29 } 30 } else { 31 echo "ファイル '{$filename}' は存在しないか、ディレクトリです。" . PHP_EOL; 32 } 33} 34 35// --- 実行例 --- 36 37// テスト用のファイルを作成 38$testFile = 'test.txt'; 39file_put_contents($testFile, 'Hello, PHP!'); 40 41// 存在するファイルのMIMEタイプを取得 42printMimeType($testFile); 43 44echo PHP_EOL; 45 46// 存在しないファイルのMIMEタイプを取得 47printMimeType('non_existent_file.txt'); 48 49// テスト用のファイルを削除 50unlink($testFile); 51 52?>
このPHPサンプルコードは、finfo::file()メソッドを使用して、指定されたファイルのMIMEタイプを取得し表示する例です。
はじめにfile_exists()関数を使い、そもそも対象のファイルが存在するのかを安全に確認しています。存在しないファイルに対して処理を行うとエラーになるため、これは重要な事前チェックです。
ファイルの存在が確認できた後、new finfo(FILEINFO_MIME_TYPE)という記述でfinfoクラスのインスタンスを生成します。このとき、引数に定数FILEINFO_MIME_TYPEを指定することで、MIMEタイプ(例: text/plain)を文字列として取得するように設定しています。
次に、$finfo->file($filename)のようにfile()メソッドを呼び出します。第一引数には、調べたいファイルのパスを指定します。このメソッドは、ファイルの中身を解析し、成功した場合はMIMEタイプを文字列で返します。一方、何らかの理由で情報の取得に失敗した場合はfalseを返します。そのため、サンプルコードでは戻り値がfalseでないことを確認してから結果を出力しています。
file_exists()関数はファイルだけでなくディレクトリの存在も確認するため、サンプルコードのようにis_file()関数を併用し、対象がファイルであることを明示的に検査することが重要です。また、finfoクラスの利用には、サーバー環境でFileinfo拡張モジュールが有効になっている必要があります。無効な場合はエラーとなるため注意してください。finfo::file()メソッドは処理に失敗するとfalseを返すため、戻り値のチェックは!==演算子で行い、型まで含めた厳密な比較を推奨します。ユーザーからの入力値をファイルパスとして使用する際は、意図しないファイルへアクセスされる危険性(パストラバーサル)を防ぐため、パスの検証を必ず行ってください。
PHP: finfo::fileでMIMEタイプを取得する
1<?php 2 3/** 4 * 指定されたファイルのMIMEタイプを調べて表示する関数 5 * 6 * このサンプルでは、まずテスト用のテキストファイルを作成します。 7 * 次に、finfoクラスのインスタンスを生成し、file()メソッドを使って 8 * そのファイルのMIMEタイプ(この場合は 'text/plain')を特定して出力します。 9 * 10 * file_get_contents() はファイルの内容を文字列として取得しますが、 11 * finfo::file() はファイルそのものの種類(MIMEタイプなど)を 12 * ファイルパスから直接調べるために使われます。 13 * 14 * @param string $filepath MIMEタイプを調べるファイルのパス 15 * @return void 16 */ 17function displayMimeType(string $filepath): void 18{ 19 // finfoオブジェクトをMIMEタイプを返すモードで作成 20 // finfo_open() のオブジェクト指向ラッパーです 21 $finfo = new finfo(FILEINFO_MIME_TYPE); 22 23 // ファイルが存在するかチェック 24 if (!file_exists($filepath)) { 25 echo "エラー: ファイル '{$filepath}' が見つかりません。\n"; 26 return; 27 } 28 29 // finfo::file() メソッドでファイルのMIMEタイプを取得 30 // 失敗した場合は false が返ります 31 $mimeType = $finfo->file($filepath); 32 33 if ($mimeType === false) { 34 echo "エラー: ファイル '{$filepath}' のMIMEタイプを特定できませんでした。\n"; 35 } else { 36 echo "ファイル '{$filepath}' のMIMEタイプは: {$mimeType}\n"; 37 } 38} 39 40// --- 実行コード --- 41 42// サンプル用のファイル名 43$filename = 'sample.txt'; 44 45// サンプル用のファイルを作成(file_put_contentsはfile_get_contentsの逆の操作) 46// このファイルの内容がMIMEタイプ特定に影響します 47$fileContent = 'これはPHPのテストファイルです。'; 48file_put_contents($filename, $fileContent); 49 50// 作成したファイルのMIMEタイプを調べて表示 51displayMimeType($filename); 52 53// テスト用に作成したファイルを削除 54unlink($filename); 55 56?>
finfo::file()メソッドは、引数で指定したファイルの情報を文字列として取得します。このメソッドは、アップロードされたファイルが意図した形式(画像、PDFなど)であるかを確認するなど、ファイルの種類を判別する目的で広く利用されます。
まず new finfo() でオブジェクトを生成します。このとき、コンストラクタの引数に FILEINFO_MIME_TYPE のような定数を渡すことで、取得したい情報の種類を指定します。サンプルコードでは、ファイルの種類を表すMIMEタイプを取得する設定にしています。
次に、生成したオブジェクトの file() メソッドを呼び出し、必須の第1引数 $filename に調べたいファイルのパスを渡します。処理が成功すると、指定した情報(この場合はMIMEタイプ)が文字列として返されます。ファイルの読み込みに失敗した場合は false が返るため、戻り値の型を厳密にチェックすることが重要です。
file_get_contents()がファイルの中身を文字列として取得するのに対し、finfo::file()はファイルの種類そのものを調べるという点が大きな違いです。
このコードは、ファイルの中身を文字列として読み込むfile_get_contents()とは目的が異なり、ファイルの種類(MIMEタイプ)を調べるfinfo::file()を使用しています。この関数は、ファイルの解析に失敗するとfalseを返すため、戻り値のチェックは==ではなく===を使って厳密に行うことが重要です。また、この機能はPHPのfileinfo拡張モジュールに依存するため、環境によっては有効化が必要です。コードをより安全にするために、finfo::file()を呼び出す前にfile_exists()でファイルの存在を確認することが推奨されます。