我正在使用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页面上输出,并且无法输出它。
我该如何解决这个问题?请
答案 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将返回一个空字符串,以便您可以从那里继续。
答案 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()."',"; ?>
}