FLASHからPOSTしたXMLをPHPで受け取る

まずクライアント側で動かすFlash、clientSide.swfに次のようなasを書く。*1 *2

xmlSendAndLoad();

function xmlSendAndLoad():Void
{
	var resXml:XML = new XML;
	resXml.ignoreWhite = true;

	resXml.onLoad = function():Void {
		trace_txt.text = resXml;
	}

	var reqXml:XML = new XML(
		'<request>' +
		'<element>content</element>' + 
		'</request>'
	);
	reqXml.sendAndLoad('serverSide.php', resXml);
}

resXmlとreqXmlという2つのXMLオブジェクトを用意しておき、reqXmlをsendAndLoadメソッドでserverSide.phpに送信する。その返値をresXmlに格納し、ステージ上に配置したtrace_txtで表示する。という簡単な仕組み。

でも、これをserverSide.php側で、

<?php

$fh = fopen('reqLog.txt', 'w');
fwrite($fh, var_export($_POST, true));
fclose($fh);

print '<response>';
print '<element>content</element>';
print '</response>';

?>

などとやっても、XMLデータは受け取れない。clientSide.swfが送信したXMLデータは、生データのままメモリのどっかに放置され、$_POSTの中には格納されてない。なにか別の方法で生データを取り出さなければ……。というわけで、

<?php

$fh = fopen('reqLog.txt', 'w');
fwrite($fh, file_get_contents('php://input'));
fclose($fh);

print '<response>';
print '<element>content</element>';
print '</response>';

?>

とすると、clientSide.swfから受け取ったXMLをreqLog.txtに保存し、クライアント側に返値用XMLを返してくれる。

file_get_contents('php://input')

こんなの普通分かんないよねー。

*1:ソースコードを色付けして記述する(シンタックス・ハイライト)記法がActionScriptに対応してない気がするのは気のせいか。…と思ったらあったよ。3年越しに発見したw

*2:as2を想定して書いているけど、考え方は基本的にas3も同じ。というか、これはPHP側の問題だしね。