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

作成日: 更新日:

curl_file_create関数は、cURL拡張機能で使用されるcurl_fileオブジェクトを生成する関数です。この関数は、ファイルをアップロードする際に、ファイル名、MIMEタイプ、および表示名を指定するために使用されます。従来の @ 記法によるファイルアップロード方法に代わる、より安全で柔軟な方法を提供します。

具体的には、ファイルアップロードを行う際に、CURLOPT_POSTFIELDS オプションに配列形式でデータを渡す場合、ファイルの内容を直接文字列として埋め込むのではなく、curl_file_create 関数で生成されたオブジェクトを代わりに指定します。

引数として、ファイルのパスを必須で指定します。オプションとして、MIMEタイプや表示名も指定可能です。MIMEタイプを指定することで、サーバーに正しいファイルの種類を通知できます。表示名は、サーバー側でファイル名として使用される場合があります。

curl_file_create 関数を使用することで、ファイルアップロード処理をより明確に記述でき、セキュリティリスクを低減できます。また、MIMEタイプや表示名を明示的に指定することで、ファイルアップロードの制御をより細かく行うことが可能になります。システムエンジニアは、この関数を利用することで、堅牢で安全なファイルアップロード機能を実装できます。

基本的な使い方

構文(syntax)

curl_file_create(string $filename, string $mimetype = '', string $postname = ''): CurlFile

引数(parameters)

string $filename, ?string $mime_type = null, ?string $posted_filename = null

  • string $filename: アップロードするファイルのパスを指定する文字列
  • ?string $mime_type: ファイルのMIMEタイプを指定する文字列。省略可能で、指定しない場合はPHPが自動的に推定します。
  • ?string $posted_filename: サーバーに送信する際のファイル名を指定する文字列。省略可能で、指定しない場合は元のファイル名が使用されます。

戻り値(return)

CURLFile

curl_file_create 関数は、CURLFile クラスのインスタンスを返します。これは、cURL を使用してファイルをアップロードする際に、ファイルの名前、MIME タイプ、およびファイルの内容を表現するためのオブジェクトです。

サンプルコード

PHP curl_file_createでファイルをアップロードする

<?php

/**
 * curl_file_createを使用してファイルをアップロードするサンプル関数
 *
 * この関数は、ローカルに一時ファイルを作成し、
 * curl_file_createでCURLFileオブジェクトを生成して、
 * httpbin.orgのPOSTエンドポイントにファイルをアップロードします。
 * 実行後、レスポンス内容を表示し、一時ファイルを削除します。
 *
 * @return void
 */
function uploadFileExample(): void
{
    // アップロード先のURL (受信したリクエスト情報をJSONで返すサービス)
    $targetUrl = 'https://httpbin.org/post';

    // アップロードするダミーファイルを作成
    $dummyFilePath = __DIR__ . '/upload_test.txt';
    $dummyFileContent = 'これはcurl_file_createのテスト用ファイルです。';
    file_put_contents($dummyFilePath, $dummyFileContent);

    echo "一時ファイルを作成しました: {$dummyFilePath}" . PHP_EOL;

    try {
        // 1. CURLFileオブジェクトの作成
        // curl_file_create(ファイルのパス, MIMEタイプ, サーバー側で認識されるファイル名)
        $cfile = curl_file_create(
            $dummyFilePath,
            'text/plain',
            'sample.txt'
        );

        // 2. POSTデータの設定
        // 'file_field' がHTMLの <input type="file" name="file_field"> のnameに相当します。
        $postData = [
            'file_field' => $cfile,
            'user_name' => 'Taro Yamada',
            'user_id' => '12345',
        ];

        // 3. cURLセッションの初期化と設定
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $targetUrl,
            CURLOPT_RETURNTRANSFER => true, // 結果を文字列で返す
            CURLOPT_POST => true,           // POSTリクエストを指定
            CURLOPT_POSTFIELDS => $postData,    // POSTデータを設定
            CURLOPT_SAFE_UPLOAD => true,    // PHP 5.6.0以降ではデフォルトでtrue
        ]);

        // 4. cURLリクエストの実行
        echo "ファイルをアップロードしています..." . PHP_EOL;
        $response = curl_exec($ch);

        // 5. エラーチェック
        if (curl_errno($ch)) {
            echo 'cURLエラー: ' . curl_error($ch) . PHP_EOL;
        } else {
            // 6. 結果の表示
            echo "サーバーからのレスポンス:" . PHP_EOL;
            // httpbin.orgはJSONを返すので、見やすく整形して表示
            $responseData = json_decode($response, true);
            echo json_encode($responseData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;
        }

        // 7. cURLセッションの終了
        curl_close($ch);

    } finally {
        // 8. 作成した一時ファイルを削除
        if (file_exists($dummyFilePath)) {
            unlink($dummyFilePath);
            echo "一時ファイルを削除しました: {$dummyFilePath}" . PHP_EOL;
        }
    }
}

// 関数を実行
uploadFileExample();

curl_file_create関数は、PHPのcURL機能を使ってファイルをアップロードする際に、アップロード対象のファイル情報をまとめたCURLFileオブジェクトを生成するために使用します。これにより、安全なファイルアップロード処理を実現できます。

関数の第一引数$filenameには、アップロードしたいファイルのローカルパスを文字列で指定します。第二引数$mime_typeには、'text/plain'のようなファイルのMIMEタイプを、第三引数$posted_filenameには、サーバー側で認識させたいファイル名を指定します。後ろ2つの引数は省略可能です。

このサンプルコードでは、まずテスト用のテキストファイルを一時的に作成します。次にcurl_file_createを使い、そのファイルのパス、MIMEタイプ、サーバー側でのファイル名を指定してCURLFileオブジェクトを生成しています。このオブジェクトを、他の送信データ(ユーザー名など)と一緒に配列に格納し、curl_setopt関数のCURLOPT_POSTFIELDSオプションに設定することで、ファイルを含むPOSTリクエストを送信します。リクエスト実行後は、サーバーからの応答を表示し、最後に作成した一時ファイルを削除して処理を終えます。

curl_file_create関数で指定するファイルパスは、意図しない動作を防ぐため絶対パスでの指定が推奨されます。また、第2引数のMIMEタイプと第3引数のアップロードファイル名は、サーバーがファイルを正しく認識するために、可能な限り明示的に指定しましょう。ファイルを送信する際、CURLOPT_POSTFIELDSには必ず配列を渡す必要があります。これにより、リクエスト形式がファイルアップロードに適したmultipart/form-dataに自動で設定されます。PHP 5.5より前の@記法は非推奨で現在は利用できないため、必ずこの関数を使用してください。最後に、処理の成功・失敗に関わらずcurl_closeでリソースを解放し、一時ファイルを削除する習慣をつけましょう。

【PHP8.x】curl_file_create関数の使い方 | いっしー@Webエンジニア