File Uploading 類別
CodeIgniter 的檔案上傳類允許檔案被上傳。您可以指定上傳某類型的檔案及指定大小的文件。
處理過程
上傳檔案普遍過程:
- 一個檔案上傳表單,允許使用者選擇一個檔案並上傳它。
- 當表單被送出,該檔案會被上傳到指定的目錄。
- 同時,該檔案將被驗證是否符合您設定的要求。
- 一旦文件上傳成功,使用者就會看到上傳成功訊息。
To demonstrate this process here is brief tutorial. Afterward you'll find reference information.
Creating the Upload Form
使用文字編輯器建立一個表單,該表單命名為 upload_form.php。將底下程式碼寫入檔案,並且另存到您的 applications/views/ 資料夾:
您會發現這裡運用了 Form 補助函數來建立表單,檔案上傳需要一個 multipart form,所以補助函數將幫助您建立合適的語法,您也會發現表單內有 $error 變數,那是用來顯示使用者上傳檔案會遇到的錯誤訊息。
上傳成功的頁面
利用文字編輯器建立一個名為 upload_success.php 的檔案。複製以下程式碼另存到 applications/views/ 目錄裡:
控制器
利用文字編輯器建立一個名為 upload.php 的檔案。複製以下程式碼另存到 applications/controllers/ 目錄裡:
上傳目錄
你還需要一個目錄存儲上傳的圖片。在根目錄上建立一個名稱為 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:
$this->upload->initialize($config);
以上偏好設定將被完全執行。以下是所有偏好設定參數的描述。
偏好設定參數
以下偏好設定都是可以使用。假如您不知道如何設定偏好參數,可以參考底下的預設值
偏好設定 | 預設值 | 選項 | 描述 |
---|---|---|---|
upload_path | None | None | 檔案目錄上傳路徑,此目錄必須可以寫入,路徑可以是絕對或者是相對。 |
allowed_types | None | None | 允許上傳文件的 MIME 類型;通常檔案副檔名可以做為 MIME 類型. 允許多個類型用豎線『|』分開。 |
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 的時候,檔名有出現任何空白都會被取代為底線,建議設定為 TRUE。 |
在 Config 檔案設定偏好值
假如您不喜歡用上述方法來設定偏好,您可以將設定寫入到 config 檔案,簡單建立一個名為 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() 函數回傳 FALSE,就會顯示錯誤訊息,此函數並不會自動輸出,而是回傳一個變數,您可以依據畫面來擺放顯示的地方。
格式化錯誤
上面的函式默認使用 <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
[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)選項有效。 |
file_ext | 檔案副檔名(包含".") |
file_size | 檔案大小(KB單位) |
is_image | 檔案是否為圖片。1 = 是. 0 = 否. |
image_width | 圖片寬度 |
image_heigth | 圖片高度 |
image_type | 圖片類型。就是副檔名(不包含".") |
image_size_str | 包含寬度跟高度的字串,適用於 image HTML 標籤裡面。 |