FlashからCGIにバイナリを送りファイルを作成する

Flash(ActionScript3.0)からPOSTメソッドでCGIにバイナリデータを送る、そのシンプルな流れをメモしておきます。

Flashから送信(ActionScript

下記はFlashのテスト部分を抜き出したものです。
ByteArray()がバイトストリームで、本来は画像データや、ファイルフォーマットになっているものを突っ込むのですが、今は分かりやすく、適当な4バイトのデータを作って送ってみます。

var bytes:ByteArray = new ByteArray();
// とりあえずバイナリデータを作成.
bytes.writeByte( 1 );
bytes.writeByte( 2 );
bytes.writeByte( 3 );
bytes.writeByte( 4 );

var cgipath:String = new String('http://localhost/cgi-bin/testpost.cgi')
var request:URLRequest = new URLRequest(cgipath);

request.contentType = 'application/octet-stream';
request.method = URLRequestMethod.POST;
request.data = bytes; //送るデータをセット.

// 送りっぱなしで終了.
sendToURL( request );

// 別ウィンドウで開くなら下記の形で送信.
//navigateToURL( request, "_blank" );

CGI受信、ファイル作成(Ruby

POSTメソッドで送られたデータはSTDINに入ってきますので、それをそのままファイルに書き出すスクリプトを書きます。
自分の分かりやすいスクリプトとしてCGIRubyを使っていますが、PerlでもPHPでもPythonでもなんでもいいです。

#!c:/ruby/bin/ruby
# ↑もちろんここは適当なパスを.

print "Content-type: text/html\n\n"
print "<html><body>"
print "Hello Ruby CGI:" + ENV['CONTENT_LENGTH']
print "</body></html>"

# そのまま書き出し.
open( "test.dat", "wb" ){ |file|
  $stdin.binmode # バイナリモードにする.
  file.write $stdin.read
  # 大きなサイズのファイルを読み込む場合には、
  # 小さめのサイズで読み込み、whileで回すと無難.
}

上記CGIでは、なんらかの出力があったほうが見栄えがいいので、適当なprintをしていますが、基本的にprintの行はなくても問題ないです。
以上で、Flash→(POST)→CGI→(ファイル)というデータの流れを作ることが出来ます。