Cookie絡みでFileReference.uploadできない現象
ちなみに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で送信できましたよ。