ちなみにAS2で開発していたときのエピソードです。

Basic認証がかかっている開発環境やログイン・ログアウトが絡んでくるFlashの場合、APIにリクエストを送る際にはいろいろとワナがあるようですね。今回はまさにそんなFlashを開発していたときに遭遇した出来事でした。

現象が起こった要因をまとめると、こんな感じです。

・Basic認証がかかっている環境だった。
・仕様上、ログイン状態のユーザーでないと画像のアップロード出来ない仕様。
・ログイン状態のセッション情報をCookieで保存していた。
・環境はWindows(Vista)。


そのときの状況を思い出しつつ書いてみたら、想像以上のくどい長文になってしまいました…。


FileReference.uploadでファイルがアップロードできない

FileReference.uploadでローカルからファイル(このときはjpg画像)をアップロードする際に、Basic認証の入力画面が再度表示されました。このときの処理としては、アップロードに成功したらonUploadCompleteDataでアップロードした画像のURLを戻り値として受け取る流れ。

しかし、画像のアップロードができない。本来ならば戻り値のURLから読み込んだサムネイル画像を表示するはずが、なんの反応もなし。このときのブラウザはFireFox。


とりあえず、ブラウザ別に挙動をチェックしてみました。
IE7では、同じようにBasic認証入力を求めるウィンドウが表示されたものの、ページをリロードして二度目を試してみたところ、正常にアップロード成功。

次にSafari。おや? Safariは正常にアップロードできている。

…なんかおかしいと思い、再度FireFoxで試してみると、…今度は正常にアップロードできている。


何度も試しているうちに、IE7でAPIへのリクエストを試行した後はどのブラウザでも正常にアップロードできることがわかりました。

そして、APIの仕様を再度確認していると、リクエスト時にセッション情報を保存しているCookie情報を見ているということにやっと気づいたのです。


セッション情報を保存していたCookieがネックだった

どうやら原因は、このCookie情報ではないかと。そしていろいろと原因を調べているうちに、どうやらどのブラウザでもCookie情報を見るときにはIEのActiveXを経由して処理を行うということがわかりました。

IE7でリクエストした後だと他のブラウザでもアップロードが成功していたのは、これが理由だったようです。


結局どう対処したかというと…、

それは以下の通り。ページを表示してswfファイルを読み込んだときにセッションIDを取得するAPIを作ってもらい、そこにまずリクエスト。そこで取得したセッションIDはセッション中ずっと変数として保持します。

そして、FileReferenceでAPIにリクエストする際にはこのセッションIDを一緒にPOSTする仕様に変更してもらいました。これでCookieに関係なくセッション状態であることを証明できた?ため、どのブラウザでもアップロード成功するようになりました。



…本題から少し脱線しますが、sendAndLoad関連でつまずいた部分を備忘録として書き記しておきます。

sendAndLoadで、LoadVarsに対してパラメータをなにも渡さないと、POST指定だったとしてもGET扱いになってしまう。

→仕様的には当たり前のことかもしれませんが、盲点でした。ためしにダミーのパラメータを一緒に渡してみたら、POSTで送信できましたよ。

HTML5飯