让codeigniter与swfupload整合的最佳解决方案


Posted in PHP onJune 12, 2014

codeigniter是一款轻量,便捷的MVC框架,最近的项目涉及到批量上传,于是,就是用了swfupload这个插件,虽然网上有很多关于ci与swfupload的帖子,不过,并不是很完整,所以,这里综合各家优点,经过自己实际经验,做了下整理。

问题1:获取不到文件类型?

回答: 由于SWFUPLOAD所有类型文件的MIME均为application/octet-stream,故使用Codeigniter自带的上传类无法准确获取是否为图片,根据ci官方的wiki已经给出了解答

In your view file, include the SWFUpload javascript file:

<script type="text/javascript" src="jscripts/SWFUpload/mmSWFUpload.js"></script> 
In your controller, pass “Filedata” as the name value for the do_upload function:
$this->upload->do_upload('Filedata') 
In your mimes.php file, add ‘application/octet-stream' for all allowed image formats
'gif'    =>    array('image/gif', 'application/octet-stream'),
'jpeg'    =>    array('image/jpeg', 'image/pjpeg', 'application/octet-stream'),
'jpg'    =>    array('image/jpeg', 'image/pjpeg', 'application/octet-stream'),
'jpe'    =>    array('image/jpeg', 'image/pjpeg', 'application/octet-stream'),
'png'    =>    array('image/png',  'image/x-png', 'application/octet-stream'),

问题2:带有session验证的后台,会导致上传后退出登陆的状况

回答:

一般方法:swfuplaod在上传时,会新开一个进程,和原来的进程不一致,要解决这个问题,需要指定session_id,然后在登录页面判断,如果有post过来的session_id,那么就用函数session_id( $_POST['PHP_SESSIONID'])指定一下。
上传页的JS里面,可以获取当前的SESSION_ID的。

ci中的状态:一般情况下,因为诸如uploadify,swfupload采用的都是flash客户端,这样它们产生的useragent与用户使用浏览器的user-agent必然不同。所以,虽然用户登录了你的系统产生了一个session,但是当触发上传程序时会产生另一个session(在上述useragent选项开启的情况下)。

所以,不是session丢失了,而是当你上传文件时,CI为uploadify另外创建了一个session。

解决方法1:将$config['sess_match_useragent']设置成FALSE,重试。

解决方法2(推荐):为了安全起见,不建议使用第1条解决方案,而是使用另外的验证方法,比如在每次上传时,在url中附加一个token与服务器端的token比对(比如这个token可以是用户名的hash值)。具体实现方法请参考stblog的上传验证实现(使用的是swfupload)。----我尝试了这个方法,重点在于,如果你的session类是放在autoload里自动加载的,那么,这样肯定是失败的,解决办法是,新建一个类,例如MY_Controller继承于CI_Controller,用于后台登陆,需要权限判断后台处理,讲upload类继承于CI_Controller这样的话,就不经过session类的验证了,当然上传还是得验证,不过可以用post_params传值进行验证:

示例:

class Upload extends CI_Controller {
//*******
//*****
}
//~~~~~~~~~~~~~~~~~
class client_photo extends MY_Controller {
    function __construct() {
        parent::__construct();
    }
 function index() {
}
}
//~~~~~~~~~~~~~~~~~~~~~
class MY_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->library('session');
}
}
PHP 相关文章推荐
提高PHP编程效率的53个要点(经验小结)
Sep 04 PHP
header导出Excel应用示例
Jan 24 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 PHP
简单实现PHP留言板功能
Dec 21 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
Jan 29 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
Jun 12 #PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 #PHP
Codeigniter整合Tank Auth权限类库详解
Jun 12 #PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 #PHP
php自动识别文件编码并转换为UTF-8的方法
Jun 12 #PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 #PHP
You might like
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
python实现两个文件合并功能
2018/04/01 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
python生成随机红包的实例写法
2019/09/02 Python
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
董事长岗位职责
2013/11/30 职场文书
服装创业计划书范文
2014/02/05 职场文书
户外宣传策划方案
2014/05/25 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
优秀教师申报材料
2014/12/16 职场文书
企业计划生育责任书
2015/05/09 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL