[php]POSTリクエストを手作りして送信する例
いくつかの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''ファイル名」の形で入れるのがよいでしょう。