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

2015-01-24信息快讯网

网上有很多关于ci与swfupload的帖子,不过,并不是很完整,所以,这里综合各家优点,经过自己实际经验,做了下整理,需要的朋友可以参考下

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中Header使用的HTTP协议及常用方法小结
phpmyadmin中禁止外网使用的方法
CI框架装载器Loader.php源码分析
PHP has encountered a Stack overflow问题解决方法
PHP处理Oracle的CLOB实例
PHP中使用addslashes函数转义的安全性原理分析
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
php中spl_autoload详解
PHP5.3安装Zend Guard Loader图文教程
安装ImageMagick出现error while loading shared libraries的解决方法
PHP实现自动登入google play下载app report的方法
PHP正则替换函数preg_replace和preg_replace_callback使用总结
PHP中unset,array_splice删除数组中元素的区别
Codeigniter实现多文件上传并创建多个缩略图
Codeigniter实现处理用户登录验证后的URL跳转
PHP数据库万能引擎类adodb配置使用以及实例集锦
教你如何用php实现LOL数据远程获取
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
PHP解析html类库simple_html_dom的转码bug
ThinkPHP使用心得分享-上传类UploadFile的使用
phpMyAdmin自动登录和取消自动登录的配置方法
PHP中spl_autoload_register()和__autoload()区别分析
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
php自动加载autoload机制示例分享
php中simplexml_load_string使用实例分享
©2014-2024 dbsqp.com