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

【PHP8.x】CURLOPT_UPLOAD定数の使い方

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

作成日: 更新日:

基本的な使い方

CURLOPT_UPLOAD定数は、PHPのcURL拡張機能において、HTTPやFTPなどのネットワークプロトコルを使用して、ローカル環境からリモートサーバーへデータをアップロードする操作を表す定数です。この定数をTRUEに設定することで、cURLセッションはアップロードモードで動作するように切り替わり、指定されたデータをサーバーへ送信する準備が整います。

主にウェブサーバーへのファイルのアップロード、例えばHTTPのPUTリクエストを利用したコンテンツの更新や、FTPプロトコルでのファイル転送など、クライアント側からサーバーへデータを送信するさまざまなシナリオで利用されます。アップロードする具体的なデータの内容は、CURLOPT_READFUNCTIONオプションと組み合わせてPHPのコールバック関数で提供するか、またはCURLOPT_INFILEオプションにファイルハンドルを指定することで定義されます。さらに、アップロードするデータのバイト数をCURLOPT_INFILESIZEオプションで明示的に指定することは、サーバー側での処理の最適化や、進捗状況の表示をより正確に行う上で推奨されます。

この定数をTRUEに設定しない場合、cURLはデフォルトでリモートサーバーからデータをダウンロード(取得)するモードで動作します。したがって、ファイルをサーバーへ送信したい場合には、必ずCURLOPT_UPLOADTRUEに設定する必要があります。また、正しくアップロード処理を行うためには、送信元のデータソースを正確に指定し、必要に応じてContent-Typeなどの適切なHTTPヘッダーを設定することが重要です。この定数を活用することで、PHPアプリケーションから柔軟なファイルアップロード機能を実現できます。

構文(syntax)

1<?php
2
3$ch = curl_init();
4curl_setopt($ch, CURLOPT_URL, "http://example.com/upload.php");
5curl_setopt($ch, CURLOPT_UPLOAD, true);
6
7?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

CURLOPT_UPLOAD定数は、リクエストがアップロード操作であることを示すための整数値を返します。この値は、HTTP POSTリクエストなどでファイルをサーバーに送信する際に使用されます。

サンプルコード

PHP: CURLOPT_UPLOADでPUTアップロードする

1<?php
2
3/**
4 * CURLOPT_UPLOAD を使用してファイルをHTTP PUTメソッドでアップロードするサンプル。
5 *
6 * CURLOPT_UPLOAD は、CURLリクエストがアップロード操作であることをCURLに通知します。
7 * これは主にHTTP PUTリクエストでファイルを送信する際に使用されます。
8 *
9 * @param string $filePath アップロードするローカルファイルのパス。
10 * @param string $url アップロード先のターゲットURL。
11 * @return string|false 成功した場合はサーバーからのレスポンスボディ、失敗した場合は false。
12 */
13function uploadFileWithPut(string $filePath, string $url): string|false
14{
15    // アップロードするファイルが存在し、読み込み可能かを確認
16    if (!file_exists($filePath) || !is_readable($filePath)) {
17        error_log("エラー: アップロードファイル '{$filePath}' が見つからないか、読み取れません。");
18        return false;
19    }
20
21    // ファイルを読み込みモードで開く
22    $fileHandle = fopen($filePath, 'r');
23    if (!$fileHandle) {
24        error_log("エラー: アップロードファイル '{$filePath}' を開けませんでした。");
25        return false;
26    }
27
28    // アップロードするファイルのサイズを取得
29    $fileSize = filesize($filePath);
30
31    // cURL セッションを初期化
32    $ch = curl_init();
33
34    // アップロード先のURLを設定
35    curl_setopt($ch, CURLOPT_URL, $url);
36
37    // HTTPメソッドをPUTに設定
38    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
39
40    // CURLOPT_UPLOAD を TRUE に設定して、アップロード操作を有効にする
41    // この定数の値はPHPの内部でint型(1)として扱われます。
42    curl_setopt($ch, CURLOPT_UPLOAD, true);
43
44    // アップロード元のファイルハンドルを設定
45    curl_setopt($ch, CURLOPT_INFILE, $fileHandle);
46
47    // アップロードするファイルのサイズを設定
48    curl_setopt($ch, CURLOPT_INFILESIZE, $fileSize);
49
50    // サーバーからのレスポンスを文字列として取得する
51    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
52
53    // 接続のタイムアウトを設定 (秒)
54    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
55
56    // 全体の実行タイムアウトを設定 (秒)
57    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
58
59    // cURL リクエストを実行
60    $response = curl_exec($ch);
61
62    // cURL エラーを確認
63    if (curl_errno($ch)) {
64        error_log('cURL エラー (' . curl_errno($ch) . '): ' . curl_error($ch));
65        $response = false;
66    } else {
67        // HTTPステータスコードを取得して表示 (デバッグ用)
68        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
69        echo "HTTP ステータスコード: " . $httpCode . "\n";
70        echo "サーバーレスポンス:\n" . $response . "\n";
71    }
72
73    // cURL セッションを閉じる
74    curl_close($ch);
75
76    // ファイルハンドルを閉じる
77    fclose($fileHandle);
78
79    return $response;
80}
81
82// --- サンプルコードの実行例 ---
83
84// 1. テスト用のダミーファイルを作成
85$dummyFileName = 'sample_upload_file.txt';
86$dummyFileContent = 'このファイルはPHP cURLアップロードテスト用です。';
87if (file_put_contents($dummyFileName, $dummyFileContent) === false) {
88    die("エラー: ダミーファイルの作成に失敗しました。\n");
89}
90echo "ダミーファイル '{$dummyFileName}' を作成しました。\n";
91
92// 2. アップロード先のURLを設定
93// IMPORTANT: 以下のURLは動作しません。
94// 実際にこのコードを実行するには、PUTリクエストを受け付けてファイルを保存する
95// WebサーバーやAPIのエンドポイントが必要です。
96// 例: 'http://your-server.com/uploads/' . $dummyFileName
97$targetUrl = 'https://httpbin.org/put'; // httpbin.org はテスト目的でPUTリクエストを受け付けます
98
99echo "\nファイルアップロードを開始します...\n";
100$uploadResult = uploadFileWithPut($dummyFileName, $targetUrl);
101
102if ($uploadResult !== false) {
103    echo "\nファイルアップロードリクエストが送信されました。\n";
104    echo "サーバーが正常に応答した場合、結果は上記に表示されています。\n";
105} else {
106    echo "\nファイルアップロードに失敗しました。\n";
107}
108
109// 3. テスト用ダミーファイルを削除
110if (file_exists($dummyFileName)) {
111    unlink($dummyFileName);
112    echo "\nダミーファイル '{$dummyFileName}' を削除しました。\n";
113}
114
115?>

CURLOPT_UPLOADは、PHPのcURL拡張機能で利用される定数の一つで、HTTPリクエストがファイルアップロード操作であることをcURLに通知するために使用されます。この定数の値はPHPの内部で整数型(int)として扱われます。

提供されたサンプルコードは、CURLOPT_UPLOADを用いてローカルファイルをHTTP PUTメソッドで指定のURLへアップロードする具体的な方法を示しています。関数uploadFileWithPutは、アップロードするローカルファイルのパスを$filePathとして、アップロード先のターゲットURLを$urlとして受け取ります。

コード内では、curl_init()でcURLセッションを初期化し、curl_setopt()関数で複数のオプションを設定します。特にcurl_setopt($ch, CURLOPT_UPLOAD, true);と設定することで、cURLがアップロードモードで動作するようになり、HTTP PUTリクエストとしてファイルを送信する準備が整います。これに加えて、CURLOPT_INFILEでアップロード元のファイルハンドルを、CURLOPT_INFILESIZEでファイルのサイズを指定します。

cURLリクエストの実行後、関数は成功した場合にサーバーからのレスポンスボディを文字列として返します。もしアップロード処理中にエラーが発生した場合は、falseが戻り値として返されます。この定数と一連のオプションを設定することで、システムエンジニアはファイルを安全かつ確実に外部サーバーへ送信する機能を実装できます。

この定数は、CURLリクエストがアップロード操作であることをCURLに通知し、主にHTTP PUTメソッドでファイルを送信する際に使用します。CURLOPT_UPLOADtrueに設定するだけではファイルはアップロードされません。別途、CURLOPT_INFILEでアップロード元のファイルハンドルを、CURLOPT_INFILESIZEでそのサイズを正確に指定する必要があります。ファイルの存在確認やオープン時のエラー、curl_exec実行後のエラーチェックは非常に重要です。また、処理完了後はcurl_closeでcURLリソースを、fcloseでファイルハンドルを必ず解放してください。targetUrlには、実際にファイルアップロードを受け付けて処理するサーバーのエンドポイントを設定する必要があります。

関連コンテンツ