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で送信できましたよ。
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で送信できましたよ。