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で挙動が異なっている点もあるかもしれないので、ご了承下さい。