Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】finfo_buffer()関数の使い方

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

作成日: 更新日:

基本的な使い方

finfo_buffer関数は、指定された文字列バッファの内容を解析し、その内容に関する情報を取得する関数です。具体的には、渡された文字列データから、そのデータの種類(例えば、画像、テキスト、実行可能ファイルなど)や、エンコーディング、MIMEタイプといった情報を判別します。

この関数は、ファイルパスではなく、メモリ上のデータに対して直接ファイル情報を取得したい場合に特に有効です。例えば、ネットワーク経由で受信したデータや、データベースから読み込んだデータなど、ファイルとして保存されていないデータに対して、その種類を判別する必要がある場合に利用できます。

関数は、magicデータベースを使用してファイル情報を解析します。magicデータベースは、ファイルの内容のパターンと対応するファイルタイプを記述したデータベースです。finfo_buffer関数は、このデータベースを参照して、入力されたバッファの内容を解析し、最も適切なファイルタイプを特定します。

finfo_buffer関数を使用するには、まずfinfo_open関数を使用してfileinfoリソースを作成する必要があります。そして、そのリソースと解析したい文字列バッファをfinfo_buffer関数に渡します。関数は、解析結果を文字列として返します。解析に失敗した場合は、FALSEを返します。

finfo_buffer関数は、ファイルの内容に基づいてファイルタイプを判別するため、ファイル拡張子に依存しません。そのため、拡張子が誤っているファイルや、拡張子がないファイルに対しても正確なファイルタイプを判別することができます。

構文(syntax)

1finfo_buffer(
2    finfo $finfo,
3    string $string,
4    int $options = 0
5): string|false

引数(parameters)

finfo $finfo, string $string, int $flags = 0, mixed $context = null

  • finfo $finfo: ファイル情報取得のためのfinfoリソース
  • string $string: ファイル情報(mimetype)を取得したい文字列データ
  • int $flags = 0: ファイル情報の取得方法を指定するフラグ(デフォルトは0)
  • mixed $context = null: コンテキストを指定(通常はnull)

戻り値(return)

string|false

指定されたバッファの内容に基づいて、MIMEタイプの文字列を返します。指定されたバッファの内容を識別できなかった場合は、falseを返します。

サンプルコード

PHP finfo_buffer でファイルタイプを識別する

1<?php
2
3/**
4 * finfo_buffer 関数の基本的な使用例とエラーハンドリングを示す関数です。
5 *
6 * この関数は、`finfo_buffer` が "not working" と感じられる一般的なシナリオをカバーし、
7 * 正しいセットアップと使用方法を示すことで、問題解決のヒントを提供します。
8 *
9 * 主なポイント:
10 * 1. `finfo_open()` で finfo オブジェクトを正しく初期化すること。
11 * 2. `finfo_open()` が失敗した場合のエラーハンドリング。
12 * 3. さまざまなタイプのバッファ (テキスト、バイナリ) での動作。
13 * 4. `finfo_buffer()` の第3引数でフラグを指定し、異なる情報 (例: MIMEタイプ) を取得する方法。
14 * 5. 最後に `finfo_close()` でリソースを解放すること。
15 */
16function demonstrateFinfoBufferUsage(): void
17{
18    // 1. finfo_open() を使用して finfo オブジェクトを初期化します。
19    // FILEINFO_NONE はデフォルトのフラグで、詳細なファイルタイプ情報を返します。
20    $finfo = finfo_open(FILEINFO_NONE);
21
22    // finfo_open() が失敗した場合のチェックは非常に重要です。
23    // PHPの 'fileinfo' 拡張が有効になっていないか、
24    // ファイル情報データベースが見つからない場合に失敗することがあります。
25    if (false === $finfo) {
26        echo "エラー: finfo_open() に失敗しました。\n";
27        echo "php.ini で 'extension=fileinfo' が有効になっているか、\n";
28        echo "およびファイル情報データベース (マジックファイル) が利用可能か確認してください。\n";
29        return;
30    }
31
32    echo "finfo オブジェクトが正常にオープンされました。\n\n";
33
34    // 2. 分析対象となる文字列バッファをいくつか準備します。
35    // 通常のテキストデータ
36    $textBuffer = "This is a simple plain text string for demonstration.";
37
38    // GIFファイルの先頭バイトを模倣したバイナリデータ (マジックナンバー)
39    // GIF89a のマジックナンバーは "GIF89a" (ASCII) です。
40    $gifBuffer = hex2bin('4749463839610102030405060708090A0B0C0D0E0F');
41
42    // PDFファイルの先頭バイトを模倣したバイナリデータ (マジックナンバー)
43    // PDF のマジックナンバーは "%PDF-" (ASCII) です。
44    $pdfBuffer = hex2bin('255044462D312E340A25C4C5C5C5C5C50A');
45
46    // 空のバッファ
47    $emptyBuffer = "";
48
49
50    // 3. finfo_buffer() を使用してバッファの情報を取得します (デフォルトフラグ: FILEINFO_NONE)。
51    // このフラグでは、人間が読みやすい形式のファイルタイプ情報が返されます。
52    echo "--- バッファ解析 (デフォルトフラグ: FILEINFO_NONE) ---\n";
53
54    // テキストバッファの解析
55    $resultText = finfo_buffer($finfo, $textBuffer);
56    if (false !== $resultText) {
57        echo "テキストバッファ ('" . substr($textBuffer, 0, 20) . "...') -> " . $resultText . "\n";
58    } else {
59        echo "エラー: テキストバッファの解析に失敗しました。\n";
60    }
61
62    // GIFバッファの解析
63    $resultGif = finfo_buffer($finfo, $gifBuffer);
64    if (false !== $resultGif) {
65        echo "GIFバッファ ('" . substr($gifBuffer, 0, 20) . "...') -> " . $resultGif . "\n";
66    } else {
67        echo "エラー: GIFバッファの解析に失敗しました。\n";
68    }
69
70    // PDFバッファの解析
71    $resultPdf = finfo_buffer($finfo, $pdfBuffer);
72    if (false !== $resultPdf) {
73        echo "PDFバッファ ('" . substr($pdfBuffer, 0, 20) . "...') -> " . $resultPdf . "\n";
74    } else {
75        echo "エラー: PDFバッファの解析に失敗しました。\n";
76    }
77
78    // 空のバッファの解析 (通常 'empty' または 'text/plain' が返されることが多いです)
79    $resultEmpty = finfo_buffer($finfo, $emptyBuffer);
80    if (false !== $resultEmpty) {
81        echo "空のバッファ ('') -> " . $resultEmpty . "\n";
82    } else {
83        echo "エラー: 空のバッファの解析に失敗しました。\n";
84    }
85
86    echo "\n";
87
88
89    // 4. finfo_buffer() の第3引数で FILEINFO_MIME フラグを指定して、MIME タイプ情報を取得します。
90    // このフラグでは、'image/gif; charset=binary' のようなMIMEタイプが返されます。
91    echo "--- バッファ解析 (フラグ: FILEINFO_MIME) ---\n";
92
93    $resultMimeText = finfo_buffer($finfo, $textBuffer, FILEINFO_MIME);
94    if (false !== $resultMimeText) {
95        echo "テキストバッファ (MIME): '" . substr($textBuffer, 0, 20) . "...' -> " . $resultMimeText . "\n";
96    } else {
97        echo "エラー: テキストバッファ (MIME) の解析に失敗しました。\n";
98    }
99
100    $resultMimeGif = finfo_buffer($finfo, $gifBuffer, FILEINFO_MIME);
101    if (false !== $resultMimeGif) {
102        echo "GIFバッファ (MIME): '" . substr($gifBuffer, 0, 20) . "...' -> " . $resultMimeGif . "\n";
103    } else {
104        echo "エラー: GIFバッファ (MIME) の解析に失敗しました。\n";
105    }
106    
107    $resultMimePdf = finfo_buffer($finfo, $pdfBuffer, FILEINFO_MIME);
108    if (false !== $resultMimePdf) {
109        echo "PDFバッファ (MIME): '" . substr($pdfBuffer, 0, 20) . "...' -> " . $resultMimePdf . "\n";
110    } else {
111        echo "エラー: PDFバッファ (MIME) の解析に失敗しました。\n";
112    }
113
114    // 5. finfo_close() を使用して finfo オブジェクトを解放します。
115    // これはメモリリークを防ぐために良い習慣です。
116    finfo_close($finfo);
117
118    echo "\nfinfo オブジェクトが正常にクローズされました。\n";
119}
120
121// 関数の実行
122demonstrateFinfoBufferUsage();
123
124?>

PHPのfinfo_buffer関数は、ファイルそのものではなく、メモリ上の文字列バッファの内容からそのファイルタイプやMIMEタイプを判別する際に使用されます。例えば、ウェブアプリケーションでアップロードされたファイルの生データや、ネットワーク経由で受信したバイナリデータがどのような形式であるかを確認したい場合に非常に有効です。

この関数を利用するには、まずfinfo_open()関数を使ってfinfoオブジェクトを生成し、そのオブジェクトをfinfo_bufferの第一引数$finfoとして渡します。第二引数$stringには解析対象となる文字列バッファ、第三引数$flagsには取得したい情報の種類を数値で指定します。例えば、FILEINFO_NONEは詳細なファイルタイプ情報を、FILEINFO_MIMEはMIMEタイプ情報を取得する際に用います。関数の戻り値は、判別されたファイルタイプやMIMEタイプを示す文字列ですが、処理に失敗した場合はfalseを返します。

サンプルコードは、「finfo_bufferが動作しない」と感じる一般的な原因とその解決策を示しています。まず、finfo_open()が成功したかを確認し、fileinfo拡張機能が有効であること、および必要なマジックファイルが利用可能であることを確認する重要性を強調しています。その後、テキストデータ、GIFやPDFのバイナリデータを模倣した文字列バッファを用意し、それぞれに対してfinfo_buffer()を使用してファイルタイプやMIMEタイプを判別する具体的な例が示されています。各ステップで戻り値がfalseでないかをチェックするエラーハンドリングも含まれており、最後にfinfo_close()でリソースを解放する適切な手順も示されています。

finfo_buffer関数を利用する際には、まずfinfo_open関数でfinfoオブジェクトを初期化し、その戻り値がfalseでないか必ず確認してください。初期化が失敗する主な原因は、PHPのfileinfo拡張が有効になっていないか、ファイル情報データベース(マジックファイル)が利用できないことです。php.ini設定でextension=fileinfoが有効になっているかを確認しましょう。また、finfo_bufferの戻り値もstringまたはfalseとなるため、常に結果をチェックし、エラー時の処理を記述することが重要です。第3引数のフラグ(例: FILEINFO_MIME)を適切に指定することで、ファイルタイプやMIMEタイプなど、目的に応じた形式の情報を取得できます。処理を終えたら、finfo_close関数で開いたfinfoオブジェクトを忘れずに解放しましょう。これらの注意点を守ることで、「not working」と感じる多くの問題を回避し、安全かつ正確にファイル情報を取得できます。

finfo_bufferでMIMEタイプを取得する

1<?php
2
3// finfo_open() を使用して、ファイル情報リソースを初期化します。
4// FILEINFO_MIME_TYPE フラグを指定すると、MIMEタイプのみを取得するように設定されます。
5// finfo_open() は、php.ini で fileinfo 拡張が有効になっている必要があります。
6$finfo = finfo_open(FILEINFO_MIME_TYPE);
7
8// finfo_open() が失敗した場合はエラーメッセージを表示し、スクリプトを終了します。
9if ($finfo === false) {
10    echo "エラー: finfo_open() の初期化に失敗しました。PHPのfileinfo拡張が有効になっているか確認してください。\n";
11    exit(1);
12}
13
14// 検査対象の文字列データを定義します。
15// 例1: 単純なテキスト文字列
16$textData = "Hello, world! This is a plain text example.";
17
18// 例2: PNG画像の先頭バイト(マジックナンバー)を模倣した文字列。
19// finfo_buffer は、このバイナリシグネチャを元にMIMEタイプを識別できます。
20$pngHeaderData = "\x89PNG\x0D\x0A\x1A\x0A"; // PNGファイルの正式なマジックナンバー(先頭8バイト)
21
22// finfo_buffer() を使用して、テキスト文字列のMIMEタイプを判別します。
23$mimeTypeText = finfo_buffer($finfo, $textData);
24
25if ($mimeTypeText === false) {
26    echo "エラー: テキストデータのMIMEタイプ取得に失敗しました。\n";
27} else {
28    echo "テキストデータ ('" . substr($textData, 0, 25) . "...') のMIMEタイプ: " . $mimeTypeText . "\n";
29}
30
31echo "\n"; // 出力を見やすくするための改行
32
33// finfo_buffer() を使用して、PNGヘッダー文字列のMIMEタイプを判別します。
34$mimeTypePng = finfo_buffer($finfo, $pngHeaderData);
35
36if ($mimeTypePng === false) {
37    echo "エラー: PNGヘッダーデータのMIMEタイプ取得に失敗しました。\n";
38} else {
39    // バイナリデータを直接表示すると文字化けする可能性があるため、先頭バイトをhexで表示
40    echo "PNGヘッダーデータ ('" . bin2hex(substr($pngHeaderData, 0, 8)) . "...') のMIMEタイプ: " . $mimeTypePng . "\n";
41}
42
43// 開いたfinfoリソースを閉じ、システムリソースを解放します。
44finfo_close($finfo);
45
46?>

PHPのfinfo_buffer関数は、ファイルそのものではなく、メモリ上にある文字列データの内容を分析し、そのデータの種類を示すMIMEタイプを特定するために利用されます。この関数を使用する前には、finfo_open関数を使ってファイル情報リソースを初期化する必要があります。finfo_openには、MIMEタイプのみを取得する設定であるFILEINFO_MIME_TYPEフラグなどを指定できます。finfo拡張がPHPで有効になっているか確認してください。

finfo_bufferの第一引数には、finfo_openで作成されたファイル情報リソースを渡します。第二引数には、MIMEタイプを判別したい文字列データを指定します。この文字列データは、通常のテキストだけでなく、PNG画像ファイルの先頭バイトのようなバイナリシグネチャ(マジックナンバー)を含んでいても、その内容から適切なMIMEタイプを識別することが可能です。

処理が成功すると、finfo_bufferは判別されたMIMEタイプを表す文字列(例:「text/plain」や「image/png」)を返します。もしMIMEタイプの取得に失敗した場合は、falseが返されるため、戻り値を確認して適切にエラー処理を行うことが重要です。一連の処理が完了したら、finfo_close関数を呼び出して、開いたファイル情報リソースを解放するようにしてください。

finfo_openを使用するには、PHPのfileinfo拡張を有効にする必要があります。初期化に失敗した場合や、finfo_bufferでMIMEタイプ取得に失敗した場合は、戻り値がfalseとなるため、必ずそのチェックを行い、適切なエラー処理を実装してください。finfo_open時に指定するフラグ(例: FILEINFO_MIME_TYPE)によって取得する情報の種類が変わりますので、目的に合わせて適切に設定しましょう。finfo_bufferは、渡された文字列データの内容を解析し、そのMIMEタイプを判別します。画像ファイルの「マジックナンバー」のようなバイナリデータからでも識別が可能です。ファイル情報のリソースは、処理が終わったらfinfo_closeで忘れずに解放することが重要です。

関連コンテンツ

関連IT用語