• codeigniter与swfupload完整解决方案


    转自:http://blog.sina.com.cn/s/blog_6d8dc8eb0100s4bv.html

        codeigniter(简称ci)有研究了一段时间了,看重的是ci的轻量,便捷,最近公司因为涉及到批量上传,所以,就是用了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验证的后台,会导致上传后退出登陆的状况
    回答:

    一般方法1: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');

    }

    }

    ~~~~~~~~~~~~~~~~~~~

  • 相关阅读:
    hashids typescript lua 定义文件
    luarocks 私服搭建&简单使用
    dremio 21.1 UI 新变动
    localstack 试用
    iasqlengine 基础设施即数据
    apisix 提供的一些方便的openresty lua 模块
    citus ha 参考部署方案
    citus 一些不错的资料
    minio Error: Storage resources are insufficient for the read operation 问题参考解决
    citus 11.0 beta 发布
  • 原文地址:https://www.cnblogs.com/shanmao/p/3615566.html
Copyright © 2020-2023  润新知