1 教程-内容提要
1.1 CodeIgniter3.1教程——开始
1.2 加载静态内容
1.3 读取新闻条目
1.4 创建新闻条目
2 常规主题
2.1 CodeIgniter URL
2.2 控制器
2.3 保留名称
2.4 视图
2.5 模型
2.6 辅助函数
2.7 使用 CodeIgniter 类库
2.8 创建类库
2.9 使用 CodeIgniter 驱动器
2.10 创建驱动器
2.11 创建核心系统类
2.12 创建附属类
2.13 钩子 - 扩展框架核心
2.14 自动加载资源
2.15 公共函数
2.16 兼容性函数
2.17 URI 路由
2.18 错误处理
2.19 网页缓存
2.20 程序分析
2.21 以 CLI 方式运行
2.22 管理你的应用程序
2.23 处理多环境
2.24 在视图文件中使用 PHP 替代语法
2.25 安全
2.26 PHP 开发规范
3 类库参考
3.1 基准测试类
3.2 缓存驱动器
3.3 日历类
3.4 购物车类
3.5 配置类
3.6 Email 类
3.7 加密类(废弃)
3.8 加密类(新版)
3.9 文件上传类
3.10 表单验证类
3.11 FTP 类
3.12 图像处理类
3.13 输入类
3.14 Javascript 类
3.15 语言类
3.16 加载器类
3.17 迁移类
3.18 输出类
3.19 分页类
3.20 模板解析类
3.21 安全类
3.22 Session 类
3.23 HTML 表格类
3.24 引用通告类
3.25 排版类
3.26 单元测试类
3.27 URI 类
3.28 用户代理类
3.29 XML-RPC 与 XML-RPC 服务器类
3.30 Zip 编码类
4 数据库参考
4.1 数据库快速入门: 示例代码
4.2 数据库配置
4.3 连接你的数据库
4.4 查询
4.5 生成查询结果
4.6 查询辅助函数
4.7 查询构造器类
4.8 事务
4.9 数据库元数据
4.10 自定义函数调用
4.11 查询缓存
4.12 数据库工厂类
4.13 数据库工具类
4.14 数据库驱动器参考
5 辅助函数参考
5.1 数组辅助函数
5.2 验证码辅助函数
5.3 Cookie 辅助函数
5.4 日期辅助函数
5.5 目录辅助函数
5.6 下载辅助函数
5.7 邮件辅助函数
5.8 文件辅助函数
5.9 表单辅助函数
5.10 HTML 辅助函数
5.11 Inflector 辅助函数
5.12 语言辅助函数
5.13 数字辅助函数
5.14 路径辅助函数
5.15 安全辅助函数
5.16 表情辅助函数(废弃)
5.17 字符串辅助函数
5.18 文本辅助函数
5.19 排版辅助函数
5.20 URL 辅助函数
5.21 XML 辅助函数

文件上传类

2017-12-03 19:57:21
linefo
625
最后编辑:linefo 于 2017-12-03 20:57:57

文件上传类

CodeIgniter 的文件上传类用于上传文件,你可以设置参数限制上传文件的类型和大小。

处理流程

上传一个文件通常涉及以下几步:

  • 显示一个上传表单,用户选择文件并上传。
  • 当提交表单时,文件将被上传到你指定的目录。
  • 同时,根据你设置的参数对文件进行校验是否允许上传。
  • 上传成功后,向用户显示成功消息。

下面是个简单的教程来示范该过程,然后会列出一些其他的参考信息。

创建上传表单

使用文本编辑器新建一个文件 upload_form.php ,放入如下代码,并保存到 application/views/ 目录下:

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<?php echo $error;?>

<?php echo form_open_multipart('upload/do_upload');?>

<input type="file" name="userfile" size="20" />

<br /><br />

<input type="submit" value="upload" />

</form>

</body>
</html>

你会注意到我们使用了表单辅助函数来创建 form 的起始标签,文件上传需要使用 multipart 表单, 辅助函数可以帮你正确生成它。还要注意的是,代码里有一个 $error 变量,当发生错误时, 可以用它来显示错误信息。

上传成功页面

使用文本编辑器新建一个文件 upload_success.php ,放入如下代码,并保存到 application/views/ 目录下:

<html>
<head>
<title>Upload Form</title>
</head>
<body>

<h3>Your file was successfully uploaded!</h3>

<ul>
<?php foreach ($upload_data as $item => $value):?>
<li><?php echo $item;?>: <?php echo $value;?></li>
<?php endforeach; ?>
</ul>

<p><?php echo anchor('upload', 'Upload Another File!'); ?></p>

</body>
</html>

控制器

使用文本编辑器新建一个控制器 Upload.php ,放入如下代码,并保存到 application/controllers/ 目录下:

<?php

class Upload extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->helper(array('form', 'url'));
    }

    public function index()
    {
        $this->load->view('upload_form', array('error' => ' ' ));
    }

    public function do_upload()
    {
        $config['upload_path']      = './uploads/';
        $config['allowed_types']    = 'gif|jpg|png';
        $config['max_size']     = 100;
        $config['max_width']        = 1024;
        $config['max_height']       = 768;

        $this->load->library('upload', $config);

        if ( ! $this->upload->do_upload('userfile'))
        {
            $error = array('error' => $this->upload->display_errors());

            $this->load->view('upload_form', $error);
        }
        else
        {
            $data = array('upload_data' => $this->upload->data());

            $this->load->view('upload_success', $data);
        }
    }
}
?>

上传文件目录

你需要一个目录来保存上传的图片,在 CodeIgniter 的安装根目录下创建一个 uploads 目录, 并将它的权限设置为 777 。

尝试一下!

使用类似于下面的 URL 来方法你的站点:

example.com/index.php/upload/

你应该能看到一个上传文件的表单,尝试着上传一个图片文件(jpg、gif 或 png 都可以), 如果你的控制器中路径设置正确,你就可以成功上传文件了。

参考指南

初始化文件上传类

正如 CodeIgniter 中的其他类一样,在你的控制器中使用 $this->load->library() 方法来初始化文件上传类:

$this->load->library('upload');

初始化之后,文件上传类的对象就可以这样访问:

$this->upload

参数设置

和其他的类库一样,你可以通过你配置的参数来控制允许上传什么类型的文件。 在上面的控制器中,你设置了下面的这些参数:

$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';

$this->load->library('upload', $config);

// Alternately you can set preferences by calling the ``initialize()`` method. Useful if you auto-load the class:
$this->upload->initialize($config);

上面的参数根据它的名称就能很容易理解,下表列出了所有可用的参数。

参数

下表列出了所有可用的参数,当没有指定参数时程序会使用默认值。

参数 默认值 选项 描述
upload_path None None 文件上传的位置,必须是可写的,可以是相对路径或绝对路径
allowed_types None None 允许上的文件 MIME 类型,通常文件的后缀名可作为 MIME 类型 可以是数组,也可以是以管道符(|)分割的字符串
file_name None Desired file name 如果设置了,CodeIgniter 将会使用该参数重命名上传的文件 设置的文件名后缀必须也要是允许的文件类型 如果没有设置后缀,将使用原文件的后缀名
file_ext_tolower FALSE TRUE/FALSE (boolean) 如果设置为 TRUE ,文件后缀名将转换为小写
overwrite FALSE TRUE/FALSE (boolean) 如果设置为 TRUE ,上传的文件如果和已有的文件同名,将会覆盖已存在文件 如果设置为 FALSE ,将会在文件名后加上一个数字
max_size 0 None 允许上传文件大小的最大值(单位 KB),设置为 0 表示无限制 注意:大多数 PHP 会有它们自己的限制值,定义在 php.ini 文件中 通常是默认的 2 MB (2048 KB)。
max_width 0 None 图片的最大宽度(单位为像素),设置为 0 表示无限制
max_height 0 None 图片的最大高度(单位为像素),设置为 0 表示无限制
min_width 0 None 图片的最小宽度(单位为像素),设置为 0 表示无限制
min_height 0 None 图片的最小高度(单位为像素),设置为 0 表示无限制
max_filename 0 None 文件名的最大长度,设置为 0 表示无限制
max_filename_increment 100 None 当 overwrite 参数设置为 FALSE 时,将会在同名文件的后面加上一个自增的数字 这个参数用于设置这个数字的最大值
encrypt_name FALSE TRUE/FALSE (boolean) 如果设置为 TRUE ,文件名将会转换为一个随机的字符串 如果你不希望上传文件的人知道保存后的文件名,这个参数会很有用
remove_spaces TRUE TRUE/FALSE (boolean) 如果设置为 TRUE ,文件名中的所有空格将转换为下划线,推荐这样做
detect_mime TRUE TRUE/FALSE (boolean) 如果设置为 TRUE ,将会在服务端对文件类型进行检测,可以预防代码注入攻击 除非不得已,请不要禁用该选项,这将导致安全风险
mod_mime_fix TRUE TRUE/FALSE (boolean) 如果设置为 TRUE ,那么带有多个后缀名的文件将会添加一个下划线后缀 这样可以避免触发 Apache mod_mime 。 如果你的上传目录是公开的,请不要关闭该选项,这将导致安全风险

在配置文件中设置参数

如果你不喜欢使用上面的方法来设置参数,你可以将参数保存到配置文件中。你只需简单的创建一个文件 upload.php 并将 $config 数组放到该文件中,然后保存文件到 config/upload.php ,这些参数将会自动被使用。 如果你在配置文件中设置参数,那么你就不需要使用 $this->upload->initialize() 方法了。

类参考

class CI_Upload
initialize([array $config = array()[, $reset = TRUE]])
参数:
  • $config (array) -- Preferences
  • $reset (bool) -- Whether to reset preferences (that are not provided in $config) to their defaults
返回:

CI_Upload instance (method chaining)

返回类型:

CI_Upload

do_upload([$field = 'userfile'])
参数:
  • $field (string) -- Name of the form field
返回:

TRUE on success, FALSE on failure

返回类型:

bool

根据你设置的参数上传文件。

注解

默认情况下上传文件是来自于表单的 userfile 字段,而且表单应该是 "multipart" 类型。

<form method="post" action="some_action" enctype="multipart/form-data" />

如果你想设置你自己的字段,可以将字段名传给 do_upload() 方法:

$field_name = "some_field_name";
$this->upload->do_upload($field_name);
display_errors([$open = '<p>'[, $close = '</p>']])
参数:
  • $open (string) -- Opening markup
  • $close (string) -- Closing markup
返回:

Formatted error message(s)

返回类型:

string

如果 do_upload() 方法返回 FALSE ,可以使用该方法来获取错误信息。 该方法返回所有的错误信息,而不是是直接显示出来。

格式化错误信息

默认情况下该方法会将错误信息包在 <p> 标签中,你可以设置你自己的标签:

$this->upload->display_errors('<p>', '</p>');
data([$index = NULL])
参数:
  • $data (string) -- Element to return instead of the full array
返回:

Information about the uploaded file

返回类型:

mixed

该方法返回一个数组,包含你上传的文件的所有信息,下面是数组的原型:

Array
(
    [file_name] => mypic.jpg
    [file_type] => image/jpeg
    [file_path] => /path/to/your/upload/
    [full_path] => /path/to/your/upload/jpg.jpg
    [raw_name]  => mypic
    [orig_name] => mypic.jpg
    [client_name]   => mypic.jpg
    [file_ext]  => .jpg
    [file_size] => 22.2
    [is_image]  => 1
    [image_width]   => 800
    [image_height]  => 600
    [image_type]    => jpeg
    [image_size_str] => width="800" height="200"
)

你也可以只返回数组中的一项:

$this->upload->data('file_name');   // Returns: mypic.jpg

下表解释了上面列出的所有数组项:

描述
file_name 上传文件的文件名,包含后缀名
file_type 文件的 MIME 类型
file_path 文件的绝对路径
full_path 文件的绝对路径,包含文件名
raw_name 文件名,不含后缀名
orig_name 原始的文件名,只有在使用了 encrypt_name 参数时该值才有用
client_name 用户提交过来的文件名,还没有对该文件名做任何处理
file_ext 文件后缀名,包括句点
file_size 文件大小(单位 kb)
is_image 文件是否为图片(1 = image. 0 = not.)
image_width 图片宽度
image_height 图片高度
image_type 图片类型(通常是不带句点的文件后缀名)
image_size_str 一个包含了图片宽度和高度的字符串(用于放在 image 标签中)