檔案上傳類別

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 安裝的根目錄位置,並且 叫做 uploads,設定它的權限為777。

試看看!

試看看你的表單,訪問你的網站,使用如下相似的 url 來訪問你的網站:

example.com/index.php/upload/

你會看到一個上傳檔案的表單,試著上傳一個影像檔案(jpg, gif, or png) 都可。 如果在控制器設定的路徑是正確的話,那們一切會執行正常。

參考指南

初始化上傳類別

像大部分其他 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:

CI_Upload

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 會有幫助)