# CodeIgniter 用户指南 版本 2.2.0

编辑文档、查看近期更改请 登录 或 注册 找回密码

搜索用户指南

查看原文

# 文件上传类

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

## 处理过程

上传文件普遍的过程：

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

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

## 创建上传表单

运用文本编辑器创建一个名为upload_form.php的文件，复制以下代码并保存在`applications/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>

你会看到这里运用到了一个表单辅助函数来创建表单的开始标签，文件上传需要一个 multipart form，因为这个表单辅助函数为你创建了一个合适的语句。你还会看到我们运用了一个$error变量，当用户提交该表单出现错误时会显示相关的出错信息。

## 上传成功的页面

运用文本编辑器创建一个名为upload_success.php的文件。复制以下代码保存到`applications/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的控制器.复制以下代码并保存到`applications/controllers/`目录里：

<?php class Upload extends CI_Controller { function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); } function index() { $this->load->view('upload_form', array('error' => ' ' )); } 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()) { $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); } } } ?>

## 上传文件目录

你还需要一个目标文件夹来存储上传的图片。在根目录上创建一个名为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 function. Useful if you auto-load the class:
//【如果你在 config文件夹内的 autoload.php 文件中自动加载了 upload 类，或者在构造函数内加载了的话，可以调用初始化函数 initialize 来加载设置。————本括号内由IT不倒翁翻译，加入了自己的理解】
$this->upload->initialize($config);`

以上偏好设置将被完全执行。以下是所有偏好设置参数的描述。

## 偏好设置参数

以下偏好设置参数是可用的。当你没有特别指定偏好设置参数时，默认值如下：

偏好设置 | 默认值 | 选项 | 描述
--- | --- | --- | ---
upload_path | None | None | 文件上传路径。该路径必须是可写的，相对路径和绝对路径均可以。
allowed_types | None | None | 允许上传文件的MIME类型；通常文件扩展名可以做为MIME类型. 允许多个类型用竖线‘|’分开
file_name | None | 想要使用的文件名 | 如果设置了这个参数，CodeIgniter 将根据这里设置的文件名来对上传的文件进行重命名。文件名中的扩展名也必须是允许的文件类型。
overwrite | FALSE | TRUE/FALSE (boolean) | 是否覆盖。该参数为TRUE时，如果上传文件时碰到重名文件，将会把原文件覆盖；如果该参数为FALSE，上传文件重名时，CI将会在新文件的文件名后面加一个数字。
max_size | 0 | None | 允许上传文件大小的最大值（以K为单位）。该参数为0则不限制。注意：通常PHP也有这项限制，可以在php.ini文件中指定。通常默认为2MB。
max_width | 0 | None | 上传文件的宽度最大值（像素为单位）。0为不限制。
max_height | 0 | None | 上传文件的高度最大值（像素为单位）。0为不限制。
max_filename | 0 | None | 文件名的最大长度。0为不限制。
encrypt_name | FALSE | TRUE/FALSE (boolean) | 是否重命名文件。如果该参数为TRUE，上传的文件将被重命名为随机的加密字符串。当你想让文件上传者也不能区分自己上传的文件的文件名时，是非常有用的。当 overwrite 为 FALSE 时，此选项才起作用。
remove_spaces | TRUE | TRUE/FALSE (boolean) | 参数为TRUE时，文件名中的空格将被替换为下划线。推荐使用。

## 在配置文件里设置偏好设置参数

如果你不愿意应用如上方法进行偏好设置，你可以用一个配置文件来取代它。简单创建一个名为upload.php的文件,添加 $config数组到该文件里，然后保存文件到：config/upload.php，它将被自动加载。当你把配置参数保存到该文件里，你不需要用$this->upload->initialize函数进行手动加载。

## 运用到的函数

以下函数被运用

## $this->upload->do_upload()

根据你的偏好配置参数执行操作。注意：默认情况下上传的文件来自于提交表单里名为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)`

## $this->upload->display_errors()

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

### 格式化错误

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

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

## $this->upload->data()

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

`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"
)`

### 解释

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

Item | Description
--- | ---
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, helingjun2008, Hex, IT不倒翁, lishen2, roln, szlinz, thankwsx, wangyueqiang, yinzhili
最后修改: 2013-11-06 08:08:53