【问题标题】:Working with SWFUpload and PHP sessions issue使用 SWFUpload 和 PHP 会话问题
【发布时间】:2011-07-08 12:28:37
【问题描述】:

我正在使用 jquery 插件 swfupload。

这个插件,SWFUpload 与 php 文件 upload.php 一起工作(将上传的文件信息发送给它,并将 php 保存到目录)。

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

这会启动会话检查并设置会话变量,例如用户 ID。

现在在upload.php 中我希望输出示例。 “好的 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 变量的 session_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,但现在我收到 Undefined index: userID 错误,就像它尚未设置一样。

我也试过设置userID以外的其他变量,'test'值为123,设置在表单上传页面,想在upload.php页面输出,结果输出不了。

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

【问题讨论】:

  • 愚蠢的问题:你是否在upload.php中包含page_protect()? :) 你如何检查upload.php 是否输出了正确的数据?记录到文件?

标签: php session swfupload


【解决方案1】:

请参阅http://www.swfupload.org/forum/generaldiscussion/383 了解问题的解释。

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

【讨论】:

  • 请查看更新后的问题。我发现它确实通过了会话 ID。
【解决方案2】:

问题是 - 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 添加到表单的操作中。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 是的,我知道,输出只是一个例子,我的问题不是它不输出任何东西(文本),而是 $_SESSION['userID'] 工作时没有设置那
    【解决方案4】:

    就像你指出的 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

    【讨论】:

      【解决方案5】:

      只是不要忘记在 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()."',"; ?>
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-01
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多