Flash Player でファイルアップロードで気をつけるべきこと

Flashのサイトで、flash.net.FileReferenceを使ってファイルをアップロードする機能はよく見かけますが、地味だけど致命的になるハマりポイントが幾つかあります。これらの問題は過去にいろんなヒトがぶつかっているのですが、改めて整理してみました。

■ Flash Playerのファイルアップロードの通信は、ブラウザから通信APIを利用していない

アップロードの通信は、Webブラウザからの通信とは違うもの、と考えておく必要があるようです。このため、ieHTTPHeadersやLiveHttpHeadersのようなHTTPヘッダーをキャプチャするツールでヘッダー情報をキャプチャすることができません。

■ FirefoxやSafariで自己SSL証明書のSSL通信でアップロードに失敗する

自己証明書によるSSL通信下でファイルアップロードを行うと、アップロードに失敗します。IEではセキュリティ例外を一度承認してしまえばアップロードできるのですが、SafariやFirefoxでは意図的にサーバー証明書やルート証明書をOSやブラウザにインストールする必要があります。

■ IE以外では、アップロードリクエストに「Cookie」や「Authentification」等のHTTPヘッダーの付加情報が付かない

これもFirefoxやSafari等のIE以外のブラウザの現象です。これで問題になるのは、

  • セッション保持
  • ベーシック認証
  • Cookie-Insert等によるクラスタリング等

です。クラウド上のサーバーを利用するときも気をつけた方が良いですね。

■ Uploadメソッドでは、カスタム HTTP リクエストヘッダはサポートされない

Uploadメソッドでは、URLRequestのrequestHeaders プロパティは無視されるため、HTTPヘッダー情報をアレンジすることができません。
リファレンスより。

URLRequest オブジェクトの requestHeaders プロパティは無視されるため、カスタム HTTP リクエストヘッダはアップロードまたはダウンロードでサポートされません。

■ ネットワーク帯域が細いとき、サーバーレスポンスが遅延するときに、挙動がおかしくなる

ネットワーク帯域が遅いとき、サーバーに負荷がかかっていてレスポンスを返せないとき、ProgoressEventや、DataEventのタイミングがおかしくなることがあります。また、常駐ウィルススキャンソフトが原因のときもあります。

■ Flash Player10からはマルチスレッドアップロードがサポートされていない

Flash Player に追加された新しい機能により、Flash Player 10 にパブリッシュする場合は、FileReference.browse()、FileReference.upload()、FileReference.download()、FileReference.load() および FileReference.save() の中で、同時に実行できる操作は 1 つのみです。複数の操作を実行すると、Flash Player でランタイムエラー(コード 2174)が発生します。進行中の操作を停止するには、FileReference.cancel() を使用します。この制限は Flash Player 10 にのみ適用されます。以前のバージョンの Flash Player については、同時に複数の操作を実行しても、この制限には影響されません。

サーバ側からのCOMPLETEが受け取れないと、次のアップロードを実行できません。

 
Flash Playerのアップロード/ダウンロード機能を使うときは、これらのことに気をつけましょう!!
※Flash Player 10.1で挙動が異なっている点もあるかもしれないので、ご了承下さい。

Related Post

CreateJSでミニゲームを作ってみたCreateJSでミニゲームを作ってみた

Flash CS6 の拡張機能である Toolkit for CreateJS を利用して、ちょっとしたミニゲームを作ってみましたので、その使用感や気をつけたことを述べていきます。 今回作ったゲームは、高速で移動するライオンを、制限時間内にクリックして捕まえるゲーム?です。PC以外にはiOS5以上のiPhone/iPad、Android3.2以上の端末で動作確認しました。(モバイル端末には最適化してないです。また、PCでゲームを始めると、音がなります)作ったゲームは、コチラから。 Flash上での作業 まず、最初にやったことは、Flashだけミニゲームを完成させ、一旦、完成させた状態そのままで、CreateJSでパブリッシュしてみて(当然、動きませんが)、どの部分がJSで書き直しが必要か、あたりをつけます。