【PHP8.x】finfo_open関数の使い方

finfo_open関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

finfo_open関数は、ファイルの種類やMIMEタイプなどを特定するための準備として、ファイル情報データベース(magicデータベース)を読み込み、その情報にアクセスするためのfinfoオブジェクトを生成する関数です。この関数は、ファイルの内容を直接調べるのではなく、finfo_file関数やfinfo_buffer関数で実際にファイル情報を取得するための準備を行う役割を担います。第一引数には、関数の動作を制御するための定数を指定します。例えば、ファイルのMIMEタイプ(例: 'image/jpeg'や'text/plain')を取得したい場合はFILEINFO_MIME_TYPEを指定します。複数のオプションは|(ビット単位OR)で組み合わせて指定することもできます。第二引数では、使用するmagicデータベースファイルのパスを指定できますが、通常はnullのままで、システムに標準で用意されているデータベースが自動的に使用されます。関数が成功すると、後続の処理で使用するfinfoオブジェクトが返され、失敗した場合はfalseが返されます。この関数で生成したオブジェクトは、一連のファイル情報取得処理が終わった後にfinfo_close関数で閉じるのが一般的です。

構文(syntax)

1$finfo = finfo_open(FILEINFO_MIME_TYPE);

引数(parameters)

int $flags = FILEINFO_NONE, ?string $magic_database = null

  • int $flags = FILEINFO_NONE: ファイル情報の取得方法を指定するフラグ。デフォルトは FILEINFO_NONE。
  • ?string $magic_database = null: マジックデータベースファイルのパスを指定する文字列。指定しない場合は、PHPがデフォルトのマジックデータベースを使用する。

戻り値(return)

FInfo|false

指定されたファイル情報取得のためのリソース、または失敗した場合は false を返します。

サンプルコード

PHPでファイルのMIMEタイプを検出する

1<?php
2
3/**
4 * 指定されたファイルのMIMEタイプを検出します。
5 *
6 * @param string $filePath MIMEタイプを検出するファイルのパス。
7 * @return string|false 検出されたMIMEタイプ文字列、またはエラーが発生した場合は false。
8 */
9function getFileMimeType(string $filePath): string|false
10{
11    // finfo_open() を使って新しいファイル情報リソースを作成します。
12    // FILEINFO_MIME_TYPE フラグを指定することで、MIMEタイプのみを返却するように指示します。
13    $finfo = finfo_open(FILEINFO_MIME_TYPE);
14
15    // finfo_open() が失敗した場合 (例: Fileinfo拡張が有効でない場合) のエラーハンドリング。
16    if ($finfo === false) {
17        echo "エラー: Fileinfo拡張機能の初期化に失敗しました。PHPの設定を確認してください。\n";
18        return false;
19    }
20
21    // finfo_file() を使って指定されたファイルのMIMEタイプを取得します。
22    $mimeType = finfo_file($finfo, $filePath);
23
24    // finfo_close() を使ってファイル情報リソースを閉じ、システムリソースを解放します。
25    finfo_close($finfo);
26
27    return $mimeType;
28}
29
30// --- 以下は、getFileMimeType 関数を単体でテストするための実行コードです ---
31
32// 1. テストのための一時ファイルを作成します。
33// sys_get_temp_dir() でシステムのテンポラリディレクトリを取得し、
34// tempnam() で一意なファイル名を持つ一時ファイルを作成します。
35$tempFileName = tempnam(sys_get_temp_dir(), 'php_mime_test_');
36
37if ($tempFileName === false) {
38    echo "エラー: 一時ファイルの作成に失敗しました。\n";
39    exit(1); // 処理を終了します
40}
41
42// 2. 作成した一時ファイルにテストデータを書き込みます。
43// この内容に基づいてMIMEタイプが検出されます。
44$fileContent = "このファイルはMIMEタイプ検出のテスト用です。\nHello World!";
45if (file_put_contents($tempFileName, $fileContent) === false) {
46    echo "エラー: 一時ファイルへの書き込みに失敗しました。\n";
47    unlink($tempFileName); // 失敗してもファイルを削除
48    exit(1);
49}
50
51echo "作成された一時ファイル: " . $tempFileName . "\n";
52echo "ファイル内容:\n---\n" . $fileContent . "\n---\n";
53
54// 3. getFileMimeType 関数を呼び出し、一時ファイルのMIMEタイプを検出します。
55$detectedMimeType = getFileMimeType($tempFileName);
56
57if ($detectedMimeType !== false) {
58    echo "検出されたMIMEタイプ: " . $detectedMimeType . "\n";
59} else {
60    echo "MIMEタイプの検出に失敗しました。上記のエラーメッセージを確認してください。\n";
61}
62
63// 4. 後処理: 作成した一時ファイルを削除します。
64if (file_exists($tempFileName)) {
65    unlink($tempFileName);
66    echo "一時ファイルを削除しました: " . $tempFileName . "\n";
67}
68
69?>

このPHPのサンプルコードは、finfo_open関数を用いてファイルのMIMEタイプ(ファイルの種類を示す情報、例: text/plainimage/jpegなど)を検出する方法を示しています。finfo_openは、ファイル情報を扱うための新しいリソースを作成する関数です。

引数$flagsには、どのような種類のファイル情報を取得したいかを指定します。サンプルコードではFILEINFO_MIME_TYPEを指定しており、これによりMIMEタイプのみを検出するようにfinfo_openに指示しています。2つ目の引数$magic_databaseは、通常は指定せずデフォルト値を使用します。finfo_openの戻り値は、成功すればファイル情報リソース(FInfoオブジェクト)、失敗した場合はfalseです。

サンプルコードのgetFileMimeType関数では、まずfinfo_open(FILEINFO_MIME_TYPE)でMIMEタイプ検出用のリソースを準備します。もし準備に失敗した場合はエラーメッセージを表示し、処理を終了します。次に、finfo_file関数を使い、準備したリソースとファイルのパスを渡して、実際にMIMEタイプを取得します。処理が終わったら、finfo_close関数でリソースを閉じ、システムリソースを解放することが重要です。

関数の外では、テストのために一時ファイルを作成し、そのファイルに内容を書き込んでからgetFileMimeType関数を呼び出し、MIMEタイプを検出する一連の流れが示されています。これにより、実際にファイルの種類がどのように判別されるかを確認できます。最終的に作成した一時ファイルは削除され、後片付けも行われます。このように、finfo_openはPHPでファイルのMIMEタイプを正確に判別する際に役立つ基本的な関数です。

finfo_open関数を利用するには、PHPのFileinfo拡張機能が有効である必要があります。関数の初期化に失敗するとfalseが返されるため、必ずエラーチェックを行ってください。取得したファイル情報リソースは、処理完了後にfinfo_closeで確実に閉じることで、システムリソースを解放し、リソースリークを防ぐことが重要です。サンプルコードのFILEINFO_MIME_TYPEフラグは、MIMEタイプのみを検出したい場合に指定します。一時ファイルの作成・書き込み・削除といった関連処理も失敗の可能性があるため、各ステップでエラーハンドリングを丁寧に行うことが、安全で堅牢なコードを記述する上で非常に大切ですし、常に期待しない結果も考慮したコーディングを心がけてください。

関連コンテンツ