让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 Mysql编程之高级技巧
Aug 27 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
php判断变量类型常用方法
Apr 24 PHP
php引用传值实例详解学习
Nov 06 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
Jun 30 PHP
php获取apk包信息的方法
Aug 15 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 18 PHP
PHP大文件分割分片上传实现代码
Dec 09 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 编程的 5个良好习惯
2009/02/20 PHP
PHP 数组基础知识小结
2010/08/20 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
python rsa 加密解密
2017/03/20 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
数据库面试要点基本概念
2013/10/31 面试题
小学教师的自我评价范例
2013/10/31 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
公司转让协议书
2016/03/19 职场文书