设为首页 收藏本站
查看: 757|回复: 0

[经验分享] php中完美解决flash上传文件不能带Cookies问题

[复制链接]

尚未签到

发表于 2017-4-12 10:59:22 | 显示全部楼层 |阅读模式
  今天在项目中用到了网络上一个比较好的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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-363835-1-1.html 上篇帖子: PHP中register_globals参数为OFF和ON的区别 下篇帖子: 在Godaddy VDS (VPS)上升级PHP 到PHP5.2.X
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表