FlashのFileReferenceを使ったアップローダを作っていたところ
IE以外のブラウザではCookieが送信されない問題にぶち当たった。
そこで、CookieのデータをPOSTで送信してしまい、PHP側で無理矢理そのデータをsession_idとして認識できないかな?
と勘でやってみたところ、何故かうまくいってしまった。
ありがとうPHP。
$cookies = $_POST["cookie"]; $session_id = null; foreach (mb_split(";", $cookies) as $cookie) { $cookie = trim($cookie); $arr = mb_split("=", $cookie); if (count($arr) != 2) continue; if (session_name() == $arr[0]) { $session_id = trim($arr[1]); } } $_COOKIE[session_name()] = $session_id; ini_set("session.gc_probability", なんか数値); ini_set("session.gc_divisor", なんか数値); ini_set("session.gc_maxlifetime", なんか数値); session_start();
これで正常にセッションが開始できた。
Flash側からはExternalInterfaceでJavascriptから
document.cookie
の値を取得して、それをPOSTしてやる。
document.cookie
の内容は、全てのCookieの値が連結された文字列なので、それをPHP側でsplit処理して解析してやり、
$_COOKIE[session_name()] = セッションID
としてやる事でPHPではクッキー内にセッションIDが入っていると認識してくれるらしい。
この
$_COOKIE[session_name()] = セッションID
が正直驚きだった。
事前にsetcookie()関数を呼び出すようなクッションページをかまさないと認識してくれないかと心配していたが、すんなりうまくいってしまった。
ちなみにFlash側のソースは以下
var _cookie = ExternalInterface.call("getCookie"); // javascriptで return document.cookie; をする関数を作成しておく var req:URLRequest = new URLRequest(url); // req.requestHeaders.push(new URLRequestHeader("Cookie", _cookie)); // ↑これが使えれば一番良かったけど、FlashPlayerのセキュリティエラーになるので使えない var variables:URLVariables = new URLVariables(); variables.cookie = _cookie; req.data = variables; req.method = "POST"; // アップロード fileReference.upload(req);
Flashは素晴らしいUIが作れるものの、色々と制限やら実装抜けやら多いので苦労が絶えない。