让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 相关文章推荐
一个更简单的无限级分类菜单代码
Jan 16 PHP
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
Aug 06 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
php中curl使用指南
Feb 05 PHP
php版微信公众平台之微信网页登陆授权示例
Sep 23 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
php表单习惯用的正则表达式
Oct 11 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
php学习笔记之字符串常见操作总结
Jul 16 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
删除javascript所创建子节点的方法
2015/05/21 Javascript
轮播图组件js代码
2016/08/08 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
domReady的实现案例
2016/11/23 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
python的几种开发工具介绍
2007/03/07 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
python能做哪些生活有趣的事情
2020/09/09 Python
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
干部年终考核评语
2015/01/04 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
政协常委会议主持词
2015/07/03 职场文书
老人节主持词
2015/07/04 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android