在使用THinkPHP时候,很多地方都使用了Uploadify这个插件,
但是,用过的人,都会发现一个缺点,就是Flash上传时候,无法传递Session值。
比如:【官方发布】官网上传头像示例http://www.thinkphp.cn/code/222.html
事实上,有人有解决方案了,http://www.zoneself.org/2013/06/29/content_2240.html
但是,我应用到项目中时候,发现加上那段代码后,就无法上传了、、、出现Http404错误。。
于是只得找新的解决方案,找了两天,终于得到了比较完美的解决方案,
http://www.uploadify.com/documentation/uploadify/using-sessions-with-uploadify/
这是Uploadify官方的解决方案。。。
在上传模板页面
$('#file_upload).uploadify({
// Your normal options here
formData : { '<?php echo session_name();?>' : '<?php echo session_id();?>' }
});在控制器页面$session_name = session_name();
if (!isset($_POST[$session_name])) {
exit;
} else {
session_id($_POST[$session_name]);
session_start();
}这样就能成功的获取Session,或者Cookie值了。。。自己灵活变通哦、。。这只是官方的解决方案Demo,
从代码可以看出,官方处理的具体思路是这样的:
1. 加载含有Uploadify的页面时,将Cookies中的SessionId写入到Uploadify中的formData中;
2. 在客户端提交的时候,SessionId会被当作表单数据被Uploadify一并提交到服务端;
3. 在服务端检测,将提交上来的SessionId提取出来,并将当前状态以提交的SessionId为蓝本进行操作。这样,就能对操作进行验证,达到控制的目的。
接下来,我贴出来我实际项目的代码
上传模板的代码
$("#user-pic").uploadify({
'queueSizeLimit' : 1,
'removeTimeout' : 0.5,
'preventCaching' : true,
'multi' : false,
'swf' : '!-PUBLIC-!/uploadify-v3.1/uploadify.swf',
'uploader' : '{:U("Public/uploadImg")}',
'buttonText' : '<i class="userup-icon"></i>上传头像',
'width' : '200',
'height' : '200',
'fileTypeExts' : '*.jpg; *.png; *.gif;',
'formData' : { 'authId' : '{$Think.session.authId}' },
})重点是formData,用ThinkPHP常量把Session值取出来,命名为authId 以formData作为一个参数,传过去。。。然后就是控制器的代码,,
public function uploadImg(){
//获取登陆用户session
$user_id = $_POST['authId'];
if (!isset($_POST['authId'])) {
$this->ajaxReturn('','系统错误,请联系管理员',0,'json');//取值取用户子目录失败,故不应继续执行
exit;
} else {
$user_id = $_POST['authId']; // 将当前的SessionId设置成客户端传递回来SessionId,并赋值给子目录
//session_start(); // Thinkphp中session自动开启,故此举无效
}哦了,应该不难看懂吧。。。控制器这边,直接通过$_POST就能接收到值的。有人可能会问,什么情况下,上传图片的时候会需要用的Session
我的情况是这样的,我需要把用户上传的图片,放到他们的一个以他们id命名的文件夹中,,
在创建文件夹的时候就需要从Session值拿到这个值。。
最后,用ThinkPHP做了好几个项目了,一直处在发现问题和解决问题的过程中。。
感谢ThinkPHP让开发变得如此简便。。
也希望我的帖子能够帮助有一部分人。。。
最佳答案