2011年04月22日

PHPで multipart/form-data でPOSTされた生データを取得する

 PHPでは、php://inputのストリームをオープンすることで、HTTPのリクエストボディを生データのまま取得できる。これで、PHPが文字コードをいじったり、デコードしたりして、意図しない操作をデータに加えていると思われるとき、デバッグに有効である。しかし、そこのドキュメントにも書いてあるように、「php://input は、 enctype="multipart/form-data" に対しては使用できません。」である。フォームからのファイル投入の時などに、生データを取ってデバッグしようとすると、ちょいと困る。
 そこで、このPHPの挙動をバイパスして、multipart/form-data の生データを取得する方法。

 これは結局の所、リクエストのContent-typeを見て、Content-type: multipart/form-data の時にそのようになっている。なので、受け取ったリクエストが multipart/form-data だったら、そのContent-typeを引っぺがしてやればいい(その代わり $_FILES は使えなくなると思うけど)。
 .htaccess(または環境によってhttp.confでも)に、こんな感じで引っぺがすSetEnvIfをくべてやる。
SetEnvIf content-type (multipart/form-data)(.*) MULTIPART_FORMDATA=true
RequestHeader unset content-type env=MULTIPART_FORMDATA
 しかる後、PHP側で
	$stdin = fopen('php://input', 'r'))
while(!feof($stdin)){
echo fgets($stdin, 1024);
}
fclose($stdin);
 こんな感じで、ストリームからPOSTの生データが取れる。
タグ:PHP Linux HTTP
posted by usoinfo at 11:30 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]