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に入ってきますので、それをそのままファイルに書き出すスクリプトを書きます。
自分の分かりやすいスクリプトとしてCGIにRubyを使っていますが、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→(ファイル)というデータの流れを作ることが出来ます。