小虾虎鱼

小虾虎鱼

swfupload提示“错误302”的解决方法

作者 禾惠 发表于 2012/08/01,最后修改于 2012/08/01

    以前用谷歌浏览器打开页面使用swfupload上传文件挺正常的,今日却来个“错误:302”提示,傻眼了我。

百度一下,得到的结果基本上都是说SESSION的问题,说flash在谷歌浏览器、火狐浏览器不能传递session,需要添加一个判断:

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

但自己却不知道这段代码添加在哪。最后谷歌搜索了一下,看到一篇文章,其中说到“swfuplaod在上传时,会新开一个进程,和原来的进程不一致,要解决这个问题,需要指定session_id,然后在登录页面判断,如果有 post过来的session_id,那么就用函数session_id( $_POST['PHP_SESSIONID'])指定一下。”(其实他已经说的很清楚,怪自己笨啊没完全理解),然后自己也搜索了一下错误302的意思,最后终于找到原因的所在了。

问题原因应该是这样的:

因为swfupload是用flash上传文件的,然而由于flash在谷歌、火狐等浏览器中不能够传递session和cookie,所以在需要登陆验证的地方无法通过(不能带session或cookie),也就相当于上传文件时遇到防火墙,无法通过。

解决的方法:

swfupload中有一个post_params参数设置,我们可以通过设置:

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

当点击上传的时候,会通过POST方法传递PHPSESSID(即$_POST['PHPSESSID']),然后在登陆验证处添加如下代码:

if(isset($_POST['PHPSESSID'])){
    session_id($_POST['PHPSESSID']);
}else{
    //否则就在这里正常验证
}

当然,为了安全,我们可以在post_params中再添加一项参数,如:

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

然后在登陆验证处添加:

if(isset($_POST['PHPSESSID']) && $_POST['isadmin']=="你设置的$isadmin的值"){
    session_id($_POST['PHPSESSID']);
}else{
    //否则就在这里正常验证
}