檔案上傳類別¶
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 helper 來建立表單的 <form> 標籤開頭。 檔案上傳需要一個多部分整合的表單,所以這個輔助韓式為你建立一個適當的 html 語法,你也 會注意到我們有一個變數 $error,這將可以顯示錯誤訊息當使用者有什麼地方操作錯誤的時候。
The Success Page¶
使用文字編輯器,建立一個成功頁 upload_success.php,其中放置以下的程式碼並儲存於 application/views/ directory:
<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/ directory:
<?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 的類別,Upload class 是使用這個方法 $this->load->library()
在 controller 初始化的:
$this->load->library('upload');
一旦 Upload class 已被載入,物件將可以被使用如下方式: $this->upload
設定喜好¶
相似於其他的 libraries,你可以控制檔案上傳的規格。在上面的 controller 範例中,你的偏好設定如下:
$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);
// 或是選擇性的,你可以呼叫 ``initialize()`` 方法來設定你的偏好,這樣方式很有用當你自動載入此類別時:
$this->upload->initialize($config);
以上的偏好應該已經自我說明其規格,以下的表格說明更多其他的偏好設定。
偏好設定¶
以下是可以設置的設定,預設值說明什麼值將會被使用,如果你沒有設定其它的值的話。 The following preferences are available. The default value indicates what will be used if you do not specify that preference.
在 config file 設置偏好設定¶
如果你不喜歡使用以上的方法設定偏好,你可以將設定設置入 config file 中。
建立一個檔案叫做 upload.php, 寫入 $config array 在該檔案中,然後儲存於路徑
config/upload.php ,它將會被自動載入。你不需要使用 $this->upload->initialize()
這個方法,如果你已經將設置設定好在 config file。
類別參考¶
-
class
CI_Upload
¶ -
initialize
([array $config = array()[, $reset = TRUE]])¶ Parameters: - $config (array) – Preferences
- $reset (bool) – 沒有提供在 $config 中的設定,是否要重置這些設定至預設值
Returns: CI_Upload instance (method chaining)
Return type:
-
do_upload
([$field = 'userfile'])¶ Parameters: - $field (string) – 在表單中變數的名字
Returns: TRUE 當成功時, FALSE 當失敗時
Return type: bool
依據你的設定進行上傳。
Note
預設檔案來自欄位取名為 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>']])¶ Parameters: - $open (string) – 開始標籤
- $close (string) – 結束標籤
Returns: Formatted error message(s)
Return type: string
當
do_upload()
方法回傳錯誤時,此方法回傳錯誤訊息。
這個方法並不自動 echo ,它會返回資料,所以你可以在需要的時候使用它。
Formatting Errors
預設錯誤訊息會使用 <p> 標籤包裝,你可以設定自己的標籤包裝,如下:
$this->upload->display_errors('<p>', '</p>');
-
data
([$index = NULL])¶ Parameters: - $index (string) – Element to return instead of the full array
Returns: Information about the uploaded file
Return type: 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
解釋以上元素所代表的意義:
Item Description file_name 檔案上傳後的名稱,包含副檔名 file_type 檔案 MIME 類型 file_path 檔案在伺服器的絕對路徑 full_path 檔案在伺服器的絕對路徑,包含檔案名 raw_name 檔案名,沒有副檔名 orig_name 原始的檔案名,如果你使用加密後的檔名,此參數才有用 client_name 使用者當初提供的檔案名,對檔案名進行加密或遞增的操作之前 file_ext 檔案副檔名,包含句點 file_size 檔案大小 in kilobytes is_image 檔案是否為影像, 1 = image. 0 = not. image_width Image width image_height Image height image_type Image type (一般為沒有句點的副檔名名稱) image_size_str 一個包含影像長與寬的字串 (置入於 html tag 會有幫助)
-