CodeIgniter 上传文件总结

Publish: July 11, 2015 Category: WEB No Comments

CI对文件上传做了简单的封装,基本可以满足文件上传的需求,对多文件的上传可以采用迭代超全局变量$_FILES来实现。
CodeIgniter 的文件上传类允许文件被上传。可以设置指定上传某类型的文件及指定大小的文件。

本文包括的基本内容:

  1. 上传特殊类型文件校验问题,.icon .ico等类型文件
  2. 多个文件上传到相同目录,多个文件上传到不同目录
  3. 使用CI文件上传类注意事项

基本的一个处理过程:

  • 创建一个上传文件用的表单,允许用户选择一个文件并上传它。
  • 当这个表单被提交,该文件被上传到指定的目录。同时,该文件将被验证是否符合您设定的要求。
  • 一旦文件上传成功,还要返回一个上传成功的确认窗口。

阅读剩余部分...

Nginx服务器下CodeIgniter多应用开发&部署

Publish: July 8, 2015 Category: 运维 No Comments

基于CI的WEB项目开发过程中经常会遇到角色问题,通常情况下我们会基于权限控制实现访问控制,但有时候对一些上一定规模的项目简单的一个应用(applicaton)采用这种方式显得不够明晰。通常会采用在一个框架内部署多个应用,也就是我们在CI的官方文档中提到的一个CodeIgniter中运行多个应用。

多应用开发:

在一个 CodeIgniter 下运行多个应用程序,如果你希望在一个 CodeIgniter 下管理多个不同的应用程序,只需简单的 将 application 目录下的所有文件放置到每个应用程序独立的子目录下即可。
例如,你要创建两个应用程序:"foo" 和 "bar",你可以像下面这样组织你的目录结构:

applications/foo/
applications/foo/config/
applications/foo/controllers/
applications/foo/libraries/
applications/foo/models/
applications/foo/views/
applications/bar/
applications/bar/config/
applications/bar/controllers/
applications/bar/libraries/
applications/bar/models/
applications/bar/views/`

要选择使用某个应用程序时,你需要打开 index.php 文件然后设置 $application_folder 变量。例如,选择使用 "foo" 这个应用,你可以这样:
$application_folder = 'applications/foo'
简单来说:多个应用就用多个入口文件(index.php),比如说你有两个应用,一个admin,一个home,默认访问home的话,你就在index.php里面设置
$application_folder = 'application/home'
然后想访问admin应用的话,可以在index.php同级目录下复制index.php到admin.php,修改
$application_folder = 'application/admin'
然后修改admin文件夹里面的config/config.php里面
$config['index_page'] = 'admin.php'
就可以实现多应用共存了。访问主页就是http://domain/,访问admin的时候就是http://domain/admin.php

部署

Apache下部署跟单应用部署不存在问题,但是在在nginx可能会存在问题。
单应用下的配置通常如下(该配置基于LNMP来做,成产环境下情自行配置)

server
    {
    listen 80;
    #listen [::]:80;
    server_name abc.com;
    index index.html index.htm index.php default.html default.htm default.php;
    root  /home/wwwroot/abc.com;;

    include other.conf;
location / {
           rewrite ^/(?!index\.php|assets|favicon.ico)(.*)$ /index.php/$1last;
      }        

location ~ [^/]\.php(/|$)
    {
        try_files $uri $uri/ /index.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }
    access_log  /home/wwwlogs/abc.com.log  access;
}

对上面的配置简单的解释,开始的配置不做过多解释,可以自行搜索,从location开始。

location / {
           rewrite ^/(?!index\.php|assets|favicon.ico)(.*)$ /index.php/$1last;
}

我们知道rewrite的作用是重写,last指令会重新将rewrite后的地址在server标签中匹配location执行。首先匹配所有uri中对静态文件等index.php请求一样对待,
location ~ [^/]\.php(/|$){}
对所有的php文件递交给fastgi处理。明白了上面,看一个完整的适合两个应用的CI Nginx配置。

server
{
    listen 80;
    #listen [::]:80;
    server_name abc.com;
    index index.html index.htm index.php default.html default.htm default.php;
    root  /home/wwwroot/abc.com;

location / {
        rewrite ^/(?!index\.php|admin\.php|assets|a.txt|favicon.ico)(.*)$ /index.php/$1last;
    }

    location ~ admin\.php(/|$)
    {
    try_files $uri $uri/ /admin.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index admin.php;
        include fastcgi.conf;
    }

    location ~ [^/]\.php(/|$)
    {
    try_files $uri $uri/ /index.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }
    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }
    access_log  /home/wwwlogs/abc.com.log  access;
}

原理其实是一样的,只不过多了一个入口,因为每个应用的入口文件统一,所知只需对特定的入口文件精确匹配即可,额外家了一项location即:

 location ~ admin\.php(/|$)
    {
    try_files $uri $uri/ /admin.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index admin.php;
        include fastcgi.conf;
    }

然后对其他部分做简单修改。
重启或者重新载入nginx配置生效即可。

总结:

Codeigniter这样做多赢用违背了统一入口规范,对开发来说页比较蹩脚,希望CI4能有所改善。