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が作れるものの、色々と制限やら実装抜けやら多いので苦労が絶えない。
Comments are closed.