文件上传类

CodeIgniter 的文件上传类允许文件被上传。您可以设置指定上传某类型的文件及指定大小的文件。

处理过程

上传文件普遍的过程:

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

这里有一个简短的教程来显示这个过程。此后你将会找到相关的参考信息。

创建上传表单

运用文本编辑器创建一个名为upload_form.php的文件,复制以下代码并保存在applications/views/目录里:

  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6. <?php echo $error;?>
  7. <?php echo form_open_multipart('upload/do_upload');?>
  8. <input type="file" name="userfile" size="20" />
  9. <br /><br />
  10. <input type="submit" value="upload" />
  11. </form>
  12. </body>
  13. </html>
你会看到这里运用到了一个表单辅助函数来创建表单的开始标签,文件上传需要一个 multipart form,因为这个表单辅助函数为你创建了一个合适的语句。你还会看到我们运用了一个$error变量,当用户提交该表单出现错误时会显示相关的出错信息。 ## 上传成功的页面 运用文本编辑器创建一个名为_upload_success.php_的文件。复制以下代码保存到applications/views/目录里:
  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6. <h3>Your file was successfully uploaded!</h3>
  7. <ul>
  8. <?php foreach ($upload_data as $item => $value):?>
  9. <li><?php echo $item;?>: <?php echo $value;?></li>
  10. <?php endforeach; ?>
  11. </ul>
  12. <p><?php echo anchor('upload', 'Upload Another File!'); ?></p>
  13. </body>
  14. </html>

控制器

运用文本编辑器,创建一个名为upload.php的控制器.复制以下代码并保存到applications/controllers/目录里:

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

上传文件目录

你还需要一个目标文件夹来存储上传的图片。在根目录上创建一个名为uploads的文件夹并设置该文件夹的属性为 777。(即可读写)

提交表单

要提交你的表单,输入类似如下的URL:

  1. example.com/index.php/upload/
你将看到一个上传表单,任选一张(jpg, gif,或者png)图片进行提交. 如果你在控制器里设置的路径是正确的,它将开始工作。 # 参考指南 ## 初始化文件上传类 与CodeIgniter的其它一些类相似,文件上传类用_$this->load->library_函数在控制器里进行初始化:
  1. $this->load->library('upload');
一旦文件上传类被加载,对象将通过如下方法来引用:_$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. $this->load->library('upload', $config);
  7. // Alternately you can set preferences by calling the initialize function. Useful if you auto-load the class:
  8. //【如果你在 config文件夹内的 autoload.php 文件中自动加载了 upload 类,或者在构造函数内加载了的话,可以调用初始化函数 initialize 来加载设置。————本括号内由IT不倒翁翻译,加入了自己的理解】
  9. $this->upload->initialize($config);
以上偏好设置将被完全执行。以下是所有偏好设置参数的描述。 ## 偏好设置参数 以下偏好设置参数是可用的。当你没有特别指定偏好设置参数时,默认值如下:
偏好设置默认值选项描述
**upload_path**NoneNone文件上传路径。该路径必须是可写的,相对路径和绝对路径均可以。
**allowed_types**NoneNone允许上传文件的MIME类型;通常文件扩展名可以做为MIME类型. 允许多个类型用竖线‘|’分开
**file_name**None想要使用的文件名 如果设置了这个参数,CodeIgniter 将根据这里设置的文件名来对上传的文件进行重命名。文件名中的扩展名也必须是允许的文件类型。
**overwrite**FALSETRUE/FALSE (boolean)是否覆盖。该参数为TRUE时,如果上传文件时碰到重名文件,将会把原文件覆盖;如果该参数为FALSE,上传文件重名时,CI将会在新文件的文件名后面加一个数字。
**max_size**0None允许上传文件大小的最大值(以K为单位)。该参数为0则不限制。注意:通常PHP也有这项限制,可以在php.ini文件中指定。通常默认为2MB。
**max_width**0None上传文件的宽度最大值(像素为单位)。0为不限制。
**max_height**0None上传文件的高度最大值(像素为单位)。0为不限制。
**max_filename**0None文件名的最大长度。0为不限制。
**encrypt_name**FALSETRUE/FALSE (boolean)是否重命名文件。如果该参数为TRUE,上传的文件将被重命名为随机的加密字符串。当你想让文件上传者也不能区分自己上传的文件的文件名时,是非常有用的。当 overwrite 为 FALSE 时,此选项才起作用。
**remove_spaces**TRUETRUE/FALSE (boolean)参数为TRUE时,文件名中的空格将被替换为下划线。推荐使用。
## 在配置文件里设置偏好设置参数 如果你不愿意应用如上方法进行偏好设置,你可以用一个配置文件来取代它。简单创建一个名为_upload.php_的文件,添加 _$config_数组到该文件里,然后保存文件到:_config/upload.php_,它将被自动加载。当你把配置参数保存到该文件里,你不需要用_$this->upload->initialize_函数进行手动加载。 ## 运用到的函数 以下函数被运用 ## $this->upload->do_upload() 根据你的偏好配置参数执行操作。注意:默认情况下上传的文件来自于提交表单里名为_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)

$this->upload->display_errors()

如果do_upload()返回失败,显示错误信息。此函数不会自动输出,而是返回数据,所以你可以按你的要求安排。

格式化错误

上面的函数默认使用<p>标记错误信息。你可以像这样设置自己的分隔符。

  1. $this->upload->display_errors('<p>', '</p>');

$this->upload->data()

这是一个辅助函数,它返回你上传文件的所有相关信息的数组。

  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. )

解释

这里是对上面数组项的解释。

ItemDescription
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 =是图像。 0 = 不是图像。
image_width图像宽度.
image_height图像高度
image_type文件类型,即文件扩展名(不包括‘.’)
image_size_str一个包含width和height的字符串。用于放在一个img标签里。

翻译贡献者:cnmiss, csfhc, duanduan, helingjun2008, Hex, IT不倒翁, Jacklee, lishen2, roln, szlinz, thankwsx, wangyueqiang, yinzhili, 罗文科