13432878738 发表于 2017-4-12 10:59:22

php中完美解决flash上传文件不能带Cookies问题

  今天在项目中用到了网络上一个比较好的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, // 2MbonLoad : function() {$('demo-status').removeClass('hide');$('demo-fallback').destroy();},// The changed parts!debug : true, // enable logs, uses console.logtarget : 'demo-browse' // the element for the// overlay (Flash 10// only)});
  而在服务器端脚本(php的脚本)中为了能拿到对应的session数据,我将sessionid重新设置
  ,在处理上传文件的最开头处加入下面这句话:
  session_id($_POST['PHPSESSID']);这个也能解决php session跨页面丢失问题.详细用法请
  查阅网络 搜索 跨页面丢失session php
  这样子就能得到正常的session值了,登录验证问题完美搞定.
  到此上传完全正常.
页: [1]
查看完整版本: php中完美解决flash上传文件不能带Cookies问题