記念撮影を作ってみました(と、multipart/form-dataについて)
というわけで、記念写真機能を作りました。
[take a picture]ボタンを押すと、現在の画面を写真に撮ります。その後コメントを入れて[upload]ボタンを押すと、picturesのページに公開されます。(ただし、少なくとも一体アバターが写っていないと写真をアップロードできません!)
さて制作日記ですが、写真はBitmapData#drawで撮ってmx.graphics.codec.JPEGEncoderでByteArrayにするまでは特に変わったことはないのですが、その写真とコメントを同時にPOSTするシンプルな方法に悩みました。みなさんどうされてますか?
(1) URLVariablesに両方入れる
これだと写真をStringにしなきゃいけない。mx.utils.Base64Encoderがあるので比較的シンプルとはいえ
- 軽い処理ではない
- リクエストが肥大化する
ので避けたい。
(2) 写真はURLRequest#dataに入れ、コメントはURL変数で送る
- サーバ側での取得が一貫しない
- 今後別のByteArray(サムネイルとか)を送りたくなったとき困る
ので没。
(3) コメントと写真をデータ長つきのチャンクとして一つのByteArrayに入れる
- 受け取り側をこちらに依存させてしまう。
別に書くのは嫌じゃないけどよろしくない。
じゃあmultipart/form-dataで行くかと思ったのですが、これってライブラリ転がってないんですね。というわけで適当に書いてみました。もし既にライブラリ転がってたら優しく教えてください。
- var boundary:String = "my_boundary_hogehoge";
- var dataBytes:ByteArray = new ByteArray();
- dataBytes.writeUTFBytes("--" + boundary + "\r\n");
- dataBytes.writeUTFBytes('content-disposition: form-data; name="comment"\r\n\r\n');
- dataBytes.writeUTFBytes(comment + "\r\n");
- dataBytes.writeUTFBytes("--" + boundary + "\r\n");
- dataBytes.writeUTFBytes('content-disposition: form-data; name="picture"\r\n\r\n');
- dataBytes.writeBytes(encodedPicture);
- dataBytes.writeUTFBytes("\r\n");
- dataBytes.writeUTFBytes("--" + boundary + "\r\n");
- request.contentType = "multipart/form-data, boundary=" + boundary;
- request.method = URLRequestMethod.POST;
- request.data = dataBytes;
というわけで
- 余分な計算が不要
- リクエストが肥大化しない
- サーバサイドで普通のフォーム変数として受け取れる
- フィールドの追加が容易
と良いことだらけの水泳大会でした。
もう少しちゃんと作ってSpark projectにコミットしようかなと思います。既に転がってなければ。
2010 年 1 月 3 日 3:33 AM
canada zyrtec