文件上传类

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

处理流程

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

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

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

创建上传表单

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

  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6.  
  7. <?php echo $error;?>
  8.  
  9. <?php echo form_open_multipart('upload/do_upload');?>
  10.  
  11. <input type="file" name="userfile" size="20" />
  12.  
  13. <br /><br />
  14.  
  15. <input type="submit" value="upload" />
  16.  
  17. </form>
  18.  
  19. </body>
  20. </html>

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

上传成功页面

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

  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6.  
  7. <h3>Your file was successfully uploaded!</h3>
  8.  
  9. <ul>
  10. <?php foreach ($upload_data as $item => $value):?>
  11. <li><?php echo $item;?>: <?php echo $value;?></li>
  12. <?php endforeach; ?>
  13. </ul>
  14.  
  15. <p><?php echo anchor('upload', 'Upload Another File!'); ?></p>
  16.  
  17. </body>
  18. </html>

控制器

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

  1. <?php
  2.  
  3. class Upload extends CI_Controller {
  4.  
  5. public function __construct()
  6. {
  7. parent::__construct();
  8. $this->load->helper(array('form', 'url'));
  9. }
  10.  
  11. public function index()
  12. {
  13. $this->load->view('upload_form', array('error' => ' ' ));
  14. }
  15.  
  16. public function do_upload()
  17. {
  18. $config['upload_path'] = './uploads/';
  19. $config['allowed_types'] = 'gif|jpg|png';
  20. $config['max_size'] = 100;
  21. $config['max_width'] = 1024;
  22. $config['max_height'] = 768;
  23.  
  24. $this->load->library('upload', $config);
  25.  
  26. if ( ! $this->upload->do_upload('userfile'))
  27. {
  28. $error = array('error' => $this->upload->display_errors());
  29.  
  30. $this->load->view('upload_form', $error);
  31. }
  32. else
  33. {
  34. $data = array('upload_data' => $this->upload->data());
  35.  
  36. $this->load->view('upload_success', $data);
  37. }
  38. }
  39. }
  40. ?>

上传文件目录

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

尝试一下!

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

  1. example.com/index.php/upload/

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

参考指南

初始化文件上传类

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

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

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

  1. $this->upload

参数设置

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

  1. $config['upload_path'] = './uploads/';
  2. $config['allowed_types'] = 'gif|jpg|png';
  3. $config['max_size'] = '100';
  4. $config['max_width'] = '1024';
  5. $config['max_height'] = '768';
  6.  
  7. $this->load->library('upload', $config);
  8.  
  9. // Alternately you can set preferences by calling the ``initialize()`` method. Useful if you auto-load the class:
  10. $this->upload->initialize($config);

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

参数

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

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

在配置文件中设置参数

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

类参考

  • _class _CI_Upload
    • initialize([array $config = array()[, $reset = TRUE]])

参数:

  1. - **$config** (_array_) -- Preferences
  2. - **$reset** (_bool_) -- Whether to reset preferences (that are not provided in $config) to their defaults返回:

CI_Upload instance (method chaining)返回类型:CI_Upload

  • doupload([$field = 'userfile'_])

参数:

  1. - **$field** (_string_) -- Name of the form field返回:

TRUE on success, FALSE on failure返回类型:bool

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

注解

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

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

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

  1. $field_name = "some_field_name";
  2. $this->upload->do_upload($field_name);
  • displayerrors([$open = '

    '[, $close = '

    '_]])

参数:

  1. - **$open** (_string_) -- Opening markup
  2. - **$close** (_string_) -- Closing markup返回:

Formatted error message(s)返回类型:string

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

格式化错误信息

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

  1. $this->upload->display_errors('<p>', '</p>');
  • data([$index = NULL])

参数:

  1. - **$data** (_string_) -- Element to return instead of the full array返回:

Information about the uploaded file返回类型:mixed

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

  1. Array
  2. (
  3. [file_name] => mypic.jpg
  4. [file_type] => image/jpeg
  5. [file_path] => /path/to/your/upload/
  6. [full_path] => /path/to/your/upload/jpg.jpg
  7. [raw_name] => mypic
  8. [orig_name] => mypic.jpg
  9. [client_name] => mypic.jpg
  10. [file_ext] => .jpg
  11. [file_size] => 22.2
  12. [is_image] => 1
  13. [image_width] => 800
  14. [image_height] => 600
  15. [image_type] => jpeg
  16. [image_size_str] => width="800" height="200"
  17. )

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

  1. $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 标签中)