2012.03.06 | 

こんちは。kaminalyです。
最近Qiitaの存在を知ってはじめてみた。
初の投稿が今回の記事の内容でした。
コピペなんだが、自分のブログだしいいよね?

とてもニッチなので必要になる人がいるかわからないネタです。
サーバの都合で、外部サーバとの連携がwgetでしかできないという事がありました。
誰かの役に立てばいいけど。。



	//POSTされたデータと、$_FILES['filedata']のデータ(jpgを想定)を
	//wgetで他のサーバにPOSTするサンプル
	//※fileの細かいチェックとか、判別とかは省いています。

	$post_target = "https://example.com/hoge.api"

	$postData = "";
	$postFile = "";
	$boundary = "-----=".md5(uniqid(rand()));

	//text data
	foreach( $_POST as $key => $value ){
		$postData .= "--{$boundary}\r\n";
		$postData .= "Content-Disposition: form-data; name='" . escapeshellcmd($key) . "'\r\n\r\n";
		$postData .= escapeshellcmd($value) . "\r\n";
	}

	//image data
	if($_FILES['filedata'] && $_FILES['filedata']['error'] === 0){
		$postData .= "--{$boundary}\r\n";
		$postData .= "Content-Disposition: form-data; name='filedata'; filename='hoge.jpg'\r\n";
		$postData .= "Content-Type: image/jpeg\r\n\r\n";
		$postData .= file_get_contents($_FILES['filedata']['tmp_name'])."\r\n";
	}

	if($postData != ""){
		$postData = $postData . '--' . $boundary . '--';

		//POSTでバイナリを送る場合は、multipart/form-data形式のファイルを作って
		//--post-fileオプションを使わないと送信出来ないみたい。
		$postFile = "tmp/".md5(uniqid(rand())).".data";
		$fp = fopen($postFile, "w");
		fwrite( $fp, $postData, strlen($postData));
		fclose($fp);

		$postData = '--header="Content-Type: multipart/form-data; boundary=' . $boundary . '" --post-file="' . $postFile . '" ';
	}
	

	//sslだった場合、--no-check-certificateオプションをつけないとエラーうまく送信できない。
	//※セキュリティー的に、この処置は暫定的であるべき。
	$https = "";
	if(strpos($post_target, "https://") !== false) $https = "--no-check-certificate ";


	//返りがxmlを想定。一度ファイルに保存する場合は"-O hote.xml"などにする。
	//passthru以外にもexecやsystemが使えるが、
	//返りがバイナリの場合、passthruでないと復元が面倒。
	//ただ、passthruは即出力してしまうので、事前にContent-typeを適宜設定しておかないとうまく動かない。
	//ob_startなどでバッファリングしたデータをチェックすればうまく処理できるかも。
	header('Content-type: text/xml; charset="UTF-8"');
	passthru("wget -O - " . $https . $postData . escapeshellcmd($post_target));

	//ゴミ掃除
	if($postFile && file_exists($postFile)) unlink($postFile);