entrance>top page>PC Tips>FlashとCGIのやりとり
FlashとCGIのやりとり

※なるべくわかりやすくするために、実際とは違うことを言っていたりしますが
ご了承ください。

FlashでCGIを起動させるには、loadVariablesNumという関数を使います。
使い方:loadVariablesNum( "CGIのアドレス", 読み込み先の階層(普通は0), "POSTまたはGET" );

これにより、Flash側の_root上にある変数が全てCGIに渡ります。
三番目の引数で"GET"を指定した場合は"****.cgi?変数1=***&変数2=***&・・・"
"POST"で指定した場合は見えない形でCGI側に送信されます。
なお、変数名は、Flash側の変数名がそのまま伝わります
例:Flash内部で"_root.hennsuu"と言う変数があったら、CGIには"hennsuu"として送られる。

また、CGI側でその変数を受け取る処理をするにはPerlならば"cgi-lib.pl"
日本語を処理するのであれば更に"jcode.pl"が必要になります。
使い方はまず、二つのファイルをCGIと同じフォルダに入れ、
CGI本体のほうには、最初の方に
require 'cgi-lib.pl';
require 'jcode.pl';

と書き加えます。
これら2つのファイルは何かと言うと、C言語使いならヘッダファイルみたいなもの
と言えばわかりやすいでしょう。
要するに、関数の(Perlの場合サブルーチンだが
書くのが面倒臭いので関数と書くことにする)定義が書いてあるファイルです。
これを使うと、2つの主要な関数が使えるようになります。
&ReadParseと&jcode'convertです

ReadParse
使い方:&ReadParse(*送られてきた変数を格納する配列名);
例えば&ReadParse(*data);とすると。
CGIに送られた変数は全てdata内に格納されます。
そしてある特定の変数を取り出したい場合(例えばhensuuを取り出して$henに格納する
$hen=$data{"hensuu"};
と入力すると、"hensuu"の値が"hen"に格納されます。
このようにしてCGIに送られてくる変数を参照します。
しかし、日本語など2バイト文字を送ると、文字化けが発生してしまいます。
そこで&jcode'convertを使います。

jcode'convert
使い方:&jcode'convert(*変換する変数名,"jisまたはsjisまたはeuc");
第一引数で指定した変数の値を、第二引数で指定したコードにエンコードします。
"jis"ならjisコード、"sjis"ならシフトjis、"euc"ならEUCにエンコードします。
"sjis"にしておけばまあ問題無いと思います。
例:変数henの値をシフトJISにエンコードする。
&jcode'convert(*hen,"sjis");
これで後は普通に日本語が使えます。

次に処理を終えた後、Flashに値を返すやり方です。
loadVariablesNumはそもそもテキスト形式の外部ファイルから変数を
_rootの変数として読み込むときに使います。
ならばどうすればいいか
すなわち、CGIがテキスト形式の値を返すとFlashは変数を読み取ってくれるのです。

そもそも、loadVariablesNumで値を読み取ってもらうには、テキストが
「変数1=***&変数2=***&…」と言う形式で書かれている必要があります。
ならば、CGIも「変数1=***&変数2=***&…」と言う形式の値を返せばよいかと言うと
実はその前に一つやる作業があります。
それは、変数を返す前に
"Content-type:text/html\n\n"
という一文を返す必要があります。
これは要するに「いまからテキスト形式のデータを送るぞ」と言ったような感じでしょうか。
hen1=12、hen2=34、hen3=56という変数と値をFlashに送る場合
print "Content-type:text/html\n\n";
print "hen1=12&hen2=34&hen3=56";

とすれば、Flashの_rootに_root.hen1=12、_root.hen2=34、_root.hen3=56
として格納されます。

以上でFlashとCGIのやりとりについての説明を終わります。
下に、サンプルのFlashとそのソースファイルを置いておきました。
どうぞ、ご自由に参照してください。

※追記:FlashMXにおいては、出力がデフォルトでUTF-8なので
ムービーの先頭あたりで、アクションスクリプトで
System.useCodepage =true;
と記述しないと、jcode'convertが使用不可能になります


サンプルページ
サンプルファイル(ソースつき・ZIP圧縮)


戻る