使用SWFUpload和PHP会话问题

时间:2011-07-08 12:28:38

标签: php session swfupload

我正在使用jquery addon swfupload。

这个插件,SWFUpload与php文件upload.php配合使用(将上传的文件信息发送给它,php保存到dir)。

现在我的问题是,在我网站的每个页面中,我都包含了page_protect();

这将启动会话检查并设置会话变量,例如userID。

现在在upload.php中我希望输出示例。 “OK id 123,你做到了!”

id 123应该是那里输出的$ _SESSION ['userID']。我试图输出这个,但它在$ _SESSION ['userID']中没有任何内容。

我不明白,它适用于我的所有其他页面。

但是看起来像SWFupload当它使用flash来读取和执行upload.php会话是另一个/消失并且无法获取变量?

对此有解释吗?我该如何解决这个问题?

更新

我尝试使用action =“upload.php”创建一个html普通文件表单,并使upload.php提交session_id()。当我这样做时,我获得了与其他网站相同的ID,我的变量userID工作正常!

然后我尝试在swfupload上将debug设置为true并使upload.php输出相同,session_id,这次是另一个session_id,而不是另一个,包含user_ID变量。

所以不知何故,当它使用flash并执行upload.php时,它会启动一个完全新的会话,因此没有变量保存在其中。虽然这只是我迄今为止发现的理论。

更新

好的,现在我发现session_id是在SWFUpload配置中发送的,

post_params: {"PHPSESSID" : "<?php echo session_id(); ?>"},

我可以在代码中的upload.php中看到,在打印session_id()之后它实际上改变了会话ID:

// Code for Session Cookie workaround
    if (isset($_POST["PHPSESSID"])) {
        session_id($_POST["PHPSESSID"]);
    } else if (isset($_GET["PHPSESSID"])) {
        session_id($_GET["PHPSESSID"]);
    }

我把它放在打印出session_id()之前放置它,然后它打印出与之相同的session_id(),变量userID存储在其中。

现在我再次尝试输出userID,但现在我只收到未定义索引:userID错误,就像它尚未设置一样。

我还尝试设置另一个变量而不是userID,'test'的值为123,在表单上传页面上设置,并且想要在upload.php页面上输出,并且无法输出它。

我该如何解决这个问题?请

5 个答案:

答案 0 :(得分:3)

有关问题的解释,请参阅http://www.swfupload.org/forum/generaldiscussion/383

基本上,SWFUpload不会将会话cookie传递到您的上传脚本。解决方法是将会话ID作为参数传递,或者在调用上载脚本时可以重新创建会话的某些标识符。

答案 1 :(得分:1)

问题是 - flash上​​传者对用户的会话一无所知。默认情况下,会话数据作为cookie存储在用户的浏览器中,并作为服务器端的文件存储。要让Flash上​​传器关注会话,请执行以下操作:

{
  movie: 'uploader.swf', 
  id: 'someid',
  name: 'someid',
  flashvars: 'cookie=' + document.cookie,
}

在服务器端启动会话:

$cookies = explode(';', $_POST['cookie']);

// Get your session cookie like
// list($cookieName, $cookieValue) = str_split('=', $_GET['cookie']);

session_name($sessionName);
session_start();

作为替代方案,您始终可以像现在一样添加会话ID以形成行动。

答案 2 :(得分:0)

默认SWFUpload将文件逐个发送到upload.php - 然后将表单提交到目标页面。它是用户实际看到的目标页面,因此输出任何东西自然不会在浏览器中显示(因为它只能由Flash应用程序看到,并转发到javascript)。除非你明确告诉javascript显示upload.php的返回值,否则它将不可见。

答案 3 :(得分:0)

就像你指出的那样,session_id在swfupload配置中通过:

传递

//上传配置

var settings = {
        flash_url: "swfupload/swfupload.swf",
        upload_url: "swfupload/upload.php",
        post_params: {
            "PHPSESSID": "xxx",
            "uploadpath": "xxx"
        }

所以你需要做的就是在你的PHP中:

if (isset($_POST['PHPSESSID'])){
   session_id($_POST['PHPSESSID']);
}

会话是否不存在,session_id将返回一个空字符串,以便您可以从那里继续。

http://nl3.php.net/session_id

答案 4 :(得分:0)

不要忘记在php.ini中设置参数:

  session cookies to on
  and session.use_only_cookies to off

并在symfony1.x环境会话中以这种方式处理:

  post_params: {
     <?php echo "'".ini_get('session.name')."':'".session_id()."',"; ?>
  }