让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 判断常量,变量和函数是否存在
Apr 26 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
PHP排序算法的复习和总结
Feb 15 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
Jun 20 PHP
简单的php中文转拼音的实现代码
Feb 11 PHP
php修改上传图片尺寸的方法
Apr 14 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
PHP中list方法用法示例
Dec 01 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 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/05/09 PHP
PHP类的特性实例分析
2016/09/28 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
python 性能提升的几种方法
2016/07/15 Python
python xml解析实例详解
2016/11/14 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
职工运动会感言
2014/02/07 职场文书
记帐员岗位责任制
2014/02/08 职场文书
毕业横幅标语
2014/10/08 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
小学中队委竞选稿
2015/11/20 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
入党申请书怎么写?
2019/06/21 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
Java 定时任务技术趋势简介
2022/05/04 Java/Android
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技