# 文件上傳類
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 標簽中)|
- 空白目錄
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- 開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 向 CodeIgniter 貢獻你的力量
- 編寫 CodeIgniter 的文檔
- Developer's Certificate of Origin 1.1
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類