SOFTELメモ Developer's blog

[php]POSTリクエストを手作りして送信する例

2022/10/23 php

いくつかのPOSTパラメータと、ファイルを、enctype=multipart/form-data 形式でphpから送信する。

API利用のような状況を想定してAuthorizationヘッダを追加しているが、必要ないときは削除してください。

<?php

// POSTするファイルとデータの情報
$filePath = '/aaa/bbb/ccc/sample.txt';
$fileName = basename($filePath);
$fileContent = file_get_contents($filePath);

// 送信するテキストパラメータ
$params = [
    'user_id' => '12345',
    'description' => 'これはテストファイルです。'
];

// 認証トークン
$authToken = 'あなたの認証トークンをここに貼り付けます'; // 例: 'xyz123abc456'

$boundary = "----Boundary" . uniqid(); // 一意の境界文字列を生成

// HTTPヘッダーの設定に Authorization ヘッダーを追加
$header = "Content-Type: multipart/form-data; boundary={$boundary}\r\n";
$header .= "Authorization: Bearer {$authToken}\r\n"; // Authorizationヘッダーを追加

// HTTPボディ(ペイロード)の構築
$content = '';

// --- テキストパラメータの追加 ---
foreach ($params as $name => $value) {
    $content .= "--{$boundary}\r\n";
    $content .= "Content-Disposition: form-data; name=\"{$name}\"\r\n\r\n";
    $content .= "{$value}\r\n";
}

// --- ファイルの追加 ---
$content .= "--{$boundary}\r\n";
$content .= "Content-Disposition: form-data; name=\"file\"; filename=\"{$fileName}\"\r\n";
$content .= "Content-Type: application/octet-stream\r\n\r\n";
$content .= $fileContent . "\r\n";

// --- 最後の境界文字列を追加 ---
$content .= "--{$boundary}--";

// ストリームコンテキストの設定
$options = [
    'http' => [
        'header'  => $header,
        'method'  => 'POST',
        'content' => $content
    ]
];

// ストリームコンテキストの作成
$context  = stream_context_create($options);

// POSTリクエストを送信
$url = 'https://example.com/upload_handler.php';
$result = file_get_contents($url, false, $context);

// 結果の表示
if ($result === false) {
    echo "エラー: POSTリクエストの送信に失敗しました。\n";
} else {
    echo "成功: ファイルとパラメータが送信されました。\n";
    echo "レスポンス:\n" . $result . "\n";
}

メモ

POSTリクエストでは、送信するパラメータの値に、区切りとなる --$boundary が現れないようにすることだけ注意。

ファイル名は上記ではそのまま使用しているが、マルチバイト文字など何が来るかわからないときは、RFC 6266形式で、rawurlencode()でエンコードして、「filename*=UTF-8''ファイル名」の形で入れるのがよいでしょう。

関連するメモ

コメント