記念撮影を作ってみました(と、multipart/form-dataについて)

by key

というわけで、記念写真機能を作りました。

[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で行くかと思ったのですが、これってライブラリ転がってないんですね。というわけで適当に書いてみました。もし既にライブラリ転がってたら優しく教えてください。

  1. var boundary:String = "my_boundary_hogehoge";
  2. var dataBytes:ByteArray = new ByteArray();
  3. dataBytes.writeUTFBytes("--" + boundary + "\r\n");
  4. dataBytes.writeUTFBytes('content-disposition: form-data; name="comment"\r\n\r\n');
  5. dataBytes.writeUTFBytes(comment + "\r\n");
  6. dataBytes.writeUTFBytes("--" + boundary + "\r\n");
  7. dataBytes.writeUTFBytes('content-disposition: form-data; name="picture"\r\n\r\n');
  8. dataBytes.writeBytes(encodedPicture);
  9. dataBytes.writeUTFBytes("\r\n");
  10. dataBytes.writeUTFBytes("--" + boundary + "\r\n");
  11.  
  12. request.contentType = "multipart/form-data, boundary=" + boundary;
  13. request.method = URLRequestMethod.POST;
  14. request.data = dataBytes;

というわけで

  • 余分な計算が不要
  • リクエストが肥大化しない
  • サーバサイドで普通のフォーム変数として受け取れる
  • フィールドの追加が容易

と良いことだらけの水泳大会でした。

もう少しちゃんと作ってSpark projectにコミットしようかなと思います。既に転がってなければ。

コメント / トラックバック 1 件

  1. freedia より:

    canada zyrtec

コメントをどうぞ