今天在项目中用到了网络上一个比较好的swiff uploader 文件上传组件,单独放到服务器测试其上传没点问题,因为没有用到鉴权等操作不会用到cookie或者session,问题不会暴露.
好了,将这个组件整合到我的项目中去,ie中没问题,一切正常,而我习惯于firefox下作开发,问题出现了.在处理上传的php脚本(upload_action.php)中加入了同一个的鉴权以及配置文件.config.php代码如下:
<?php //引入我系统的配置文件,此文件里面做了登录验证等操作,没登陆将跳到登陆页面. require_once("config.php"); //省略若干业务逻辑代码. ?>
当 再次请求我的upload.php时候,发现上传文件总是会包302错误.后来查了下错误代码,是被重定向了,
这是由于没有登陆导致跳转到登陆页面导致的(开始一直不知道什么原因,后来才知道.)
问题关键:
用户登录验证不通过.
因为我的用户验证过程是通过将userid时间戳等一系列参数存放到session来判断是否登录的.
这说明是没获取得到session,所以登录失败了.
在进一步就是说,上传这个过程在firefox中没有将sessionid传送到服务器去后来查了网络资料才知道这是个flash的bug.
网络引用资料:
使用SWFUpload的时候一定要小心cookie bug:在非IE内核内核的浏览器下使用SWFUpload上传文件时,该请求会忽略自身浏览器中的所有cookie ,只会 将IE浏览器下的属于该域的持久cookie(persistent cookies)发送到服务端,非持久cookie( Session only)不会被发送。遗憾的是此Bug并非是SWFUpload内部实现的问题(所有的 Flash上传都会存在此bug),而是FlashPlayer的bug,所有使用FileReference类上传文件时会存在此问题。幸运的是我们有办法绕开此陷阱。
现在知道问题所在,现在来看看我的解决方法.
因为swiff uploader 的类中,能直接传入post的数据 data所以我在data中就放入了我的sessionid(这个是通过js读取来的.)
读取sessionid的js代码:
//用来读取特定的cookie值。 function getCookie(cookie_name) { var allcookies = document.cookie; var cookie_pos = allcookies.indexOf(cookie_name); // 如果找到了索引,就代表cookie存在, // 反之,就说明不存在。 if (cookie_pos != -1) { // 把cookie_pos放在值的开始,只要给值加1即可。 cookie_pos += cookie_name.length + 1; var cookie_end = allcookies.indexOf(";", cookie_pos); if (cookie_end == -1) { cookie_end = allcookies.length; } var value = unescape(allcookies.substring(cookie_pos, cookie_end)); } return value; }
通过firefox的插件 web developer插件查看到cookies的值 php的sessionid
存放cookie名称为:
PHPSESSID
脚本:
PHPSESSID = getCookie("PHPSESSID"); cookiesifo = "PHPSESSID=" + PHPSESSID; var swiffy = new FancyUpload2($('demo-status'), $('demo-list'), { url : $('form-demo').action, fieldName : 'photoupload', path : 'upload/Swiff.Uploader.swf', data : cookiesifo, limitSize : 2000 * 1024 * 1024, // 2Mb onLoad : function() { $('demo-status').removeClass('hide'); $('demo-fallback').destroy(); }, // The changed parts! debug : true, // enable logs, uses console.log target : 'demo-browse' // the element for the // overlay (Flash 10 // only) });
而在服务器端脚本(php的脚本)中为了能拿到对应的session数据,我将sessionid重新设置
,在处理上传文件的最开头处加入下面这句话:
session_id($_POST['PHPSESSID']);这个也能解决php session跨页面丢失问题.详细用法请
查阅网络 搜索 跨页面丢失session php
这样子就能得到正常的session值了,登录验证问题完美搞定.
到此上传完全正常.