CodeIgnitor: Lớp Upload File
Giải phóng thời gian, khai phóng năng lực
Lớp Upload File của CodeIgniter cho phép upload các tập tin. Ta có thể thiết lập các tùy chọn khác nhau, hạn chế kiểu và kích thước file.
Để upload một file ta thực hiện các bước sau đây:
-
Tạo một form upload, cho phép người dùng chọn 1 file để upload.
-
Khi submit form thì tập tin sẽ được upload tới đích bạn muốn.
-
Xác nhận tính hợp lệ của tập tin để đảm bảo rằng nó được phép upload dựa trên những tùy chỉnh mà bạn thiết lập.
-
Sau thi upload thành công thì đưa ra thông báo để người dùng biết.
Tạo form upload
Sử dụng text editor bạn tạo một form upload_form.php, đặt mã lệnh như sau và lưu nó trong thư mục 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>
Bạn lưu ý là ta đang sử dụng một form helper để tạo thẻ mở <form>. Để upload tập tin thì form cần phải có kiểu multipart, do vậy bộ helper đã tạo sẵn cú pháp này cho bạn. Bạn cũng sẽ lưu ý là ta có một biến $error. Biến này sẽ đưa ra thông báo lỗi nếu người dùng thực hiện sai điều gì đó.
Trang success
Tạo một form gọi là upload_success.php trong thư mục application/views/ và đặt đoạn mã sau vào:
<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>
Controller
Tạo một controller gọi là Upload.php trong thư mục application/controllers/ và đặt đoạn mã sau vao:
<?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);
}
}
}
?>
Thư mục upload
Bạn tạo một thư mục để chưa file sau khi upload, đặt tên thư mục là uploads và đặt thư mục này cùng vị trí với tập tin index.php ngoài cùng, thiết lập quyền cho thư mục là 777.
Thử nghiệm
Bạn gõ đường link sau và thực hiện:
example.com/index.php/upload/
Tiến hành upload thử một file ảnh (dạng jpg, gif hoặc png). Nếu đường dẫn trong controller đúng thì nó sẽ làm việc.
Gợi ý
Khởi tạo lớp Upload
Lớp Upload được khởi tạo trong controller bằng cách sử dụng câu lệnh sau:
$this->load->library('upload');
Mỗi khi lớp này được load thì đối tượng sẽ được phép sử dụng: $this->upload.
Thiết lập tùy chọn
Trong controller đã xây dựng ở trên ta thiết lập các tùy chọn như sau:
$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);
// Bạn cũng có thể thiết lập tùy chọn bằng cách gọi phương thức initialize(). Nó hữu dụng nếu bạn sử dụng lớp auto-load:
$this->upload->initialize($config);
Mô tả các tùy chọn
Bảng dưới đây trình bày và mô tả về các tùy chọn. Giá trị mặc định sẽ chỉ ra rằng nó sẽ được sử dụng nếu ta không đưa ra tùy chọn cụ thể.
Tùy chọn | Giá trị mặc định | Lựa chọn | Mô tả |
---|---|---|---|
upload_path | None | None | Đường dẫn tới thư mục nơi tập tin upload sẽ được đặt tại đó. Thư mục phải cho phép lưu trữ file và đường dẫn có thể là tuyệt đối hoặc tương đối. |
allowed_types | None | None | Kiểu mime tương ứng với kiểu của file mà bạn cho phép upload. Thường thì phần mở rộng của file sẽ được sử dụng cho kiểu mime. Ta cũng có thể sử dụng một mảng hoặc một chuỗi phân tách. |
file_name | None | Desired file name | Nếu được thiết lập thì CodeIgniter sẽ đổi lại tên tập tin được upload thành tên tương ứng. Đuôi mở rộng của tập tin bạn cũng được quyền thay đổi. Nếu không có đuôi mở rộng thì nó sẽ lấy phần đuôi mở rộng cũ. |
file_ext_tolower | FALSE | TRUE/FALSE (boolean) | Nếu đặt là TRUE thì đuôi mở rộng sẽ ở dạng chữ thường |
overwrite | FALSE | TRUE/FALSE (boolean) | Nếu đặt là TRUE thì nếu một file có cùng tên với một file khác trong thư mục thì file đó sẽ bị ghi đè. Nếu đặt là FALSE thì sẽ thêm vào tên một con số cho khác với tên file đã có. |
max_size | 0 | None | Kích thước tối đa (kilobyte) của file upload. Nếu đặt là 0 thì tương ứng là không giới hạn kích thước. Lưu ý là phần lớp các cài đặt PHP đều có những giới hạn của chính nó và được thể hiện trong tập tin php.ini, thường thì mặc định là 2 MB (2048 KB). |
max_width | 0 | None | Độ rộng lớn nhất (đơn vị là pixel) dành cho ảnh. Đặt là 0 thì tương ứng là không giới hạn độ rộng lớn nhất. |
max_height | 0 | None | Độ cao lớn nhất (đơn vị là pixel) dành cho ảnh. Đặt là 0 thì tương ứng là không giới hạn. |
min_width | 0 | None | Độ rộng nhỏ nhất (đơn vị là pixel) dành cho ảnh. Đặt là 0 thì tương ứng là không giới hạn độ rộng nhỏ nhất. |
min_height | 0 | None | Độ rộng nhỏ nhất (đơn vị là pixel) dành cho ảnh. Đặt là 0 thì tương ứng là không giới hạn. |
max_filename | 0 | None | Độ dài lớn nhất của tên file ảnh. Đặt là 0 thì tương ứng là không giới hạn. |
max_filename_increment | 100 | None | Nếu ghi đè thành FALSE thì sử dụng use this to set the maximum filename increment for CodeIgniter to append to the filename. |
encrypt_name | FALSE | TRUE/FALSE (boolean) | Nếu thiết lập là TRUE thì tên file sẽ được chuyển thanh chuỗi mã hóa ngẫu nhiên. Điều này có thể hữu dụng nếu ta muons file được lưu trữ với tên mà người dùng không thể biết khi upload nó. |
remove_spaces | TRUE | TRUE/FALSE (boolean) | Nếu thiết lập là TRUE thì bất kỳ một dấu cách nào trong tên file sẽ được chuyển thành dấu gạch dưới, và ta nên dùng tùy chọn này. |
detect_mime | TRUE | TRUE/FALSE (boolean) | Nếu được thiết lập là TRUE thì phía trình chủ (server side) sẽ nhận dạng kiểu file mà sẽ được thực hiện để tránh những tấn công kiểu chèn mã độc. Bạn không nên bỏ sử dụng tùy chọn này trừ khi bạn không còn lựa chọn nào khác vì nó sẽ ảnh hưởng đến vấn đề bảo mật. |
mod_mime_fix | TRUE | TRUE/FALSE (boolean) | Nếu được đặt là TRUE thì các phần mở rộng của các file sẽ có dấu gạch dưới để tránh kích hoạt. Không nên tắt tùy chọn này nếu thư mục upload của bạn là public vì nó sẽ ảnh hưởng đến vấn đề bảo mật. |
Thiết lập các tùy chọn trong tập tin cấu hình
Nếu bạn không muốn các thiết lập các tùy chọn thông qua sử dụng phương thức khởi tạo thì bạn có thể thay thế bằng cách đặt chúng vào tập tin cấu hình, cụ thể là bạn tạo một tập tin mới và đặt tên là upload.php, sau đó đưa vào tập tin một mảng có tên $config, sau đó lưu vào config/upload.php và nó sẽ được sử dụng tự động mà không cần phải sử dụng phương thức $this->upload->initialize() nếu bạn tham chiếu tới tập tin config.
Tham chiếu lớp CI_Upload
initialize($config, $reset)
Tham số: |
|
---|---|
Trả về: |
Thể hiện của lớp CI_Upload |
Kiểu trả về: |
CI_Upload |
do_upload($field)
Tham số: |
$field (string) – Tên của trường form |
---|---|
Trả về: |
TRUE nếu thành công, FALSE nếu thất bại |
Kiểu trả về: |
bool |
Phương thức này dùng để upload dựa trên những tùy chọn mà bạn đã thiết lập.
<form method="post" action="some_action" enctype="multipart/form-data" />
Nếu bạn muốn thiết lập một trường chỉ đơn giản là để truyền giá trị của nó tới phương thức do_upload() thì bạn làm như sau:
$field_name = "tên_trường";
$this->upload->do_upload($field_name);
display_errors($open, $close)
Tham số: |
|
---|---|
Trả về: |
Các thông báo lỗi có định dạng |
Kiểu trả về: |
string |
Phương thức này dùng để truy xuất bất kỳ một thông báo lỗi nào nếu như phương thức do_upload() trả về false. Lưu ý là phương thức này không hiển thị thông báo tự động mà nó chỉ trả về dữ liệu và ta có thể gán cho nó nếu cần.
Định dạng các lỗi
Theo mặc định thì phương thức trên sẽ gộp tất cả các lỗi trong thẻ <p>. Bạn có thể thiết lập các định dạng của riêng bạn.
$this->upload->display_errors('<p>', '</p>');
data($index)
Tham số: |
$index (string) – Trả về phần tử cụ thể của mảng |
---|---|
Trả về: |
Thông tin về tập tin đã upload |
Kiểu trả về: |
Hỗn hợp |
Đây là một phương thức helper nó trả về mảng chứa tất cả các dữ liệu liên quan tới tập tin mà bạn đã upload. Dưới đây là nguyên mẫu của mảng:
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"
)
Để trả về một phần tử của mảng thì ta làm như sau:
$this->upload->data('file_name'); //Trả về: mypic.jpg
Đây là những mô tả cụ thể cho từng chỉ số mảng trên:
Chỉ số | Description |
---|---|
file_name | Tên tập tin đã được upload, bao gồm cả phần mở rộng |
file_type | Kiểu MIME của bộ nhận dạng |
file_path | Đường dẫn tuyệt đối tới tập tin |
full_path | Đường dẫn tuyệt đối, bao gồm cả tên của tập tin |
raw_name | Tên tập tin không có phần mở rộng |
orig_name | Tên tập tin gốc. Nó chỉ hữu dụng nếu bạn sử dụng tùy chọn mã hóa tên |
client_name | Tên tập tin được cung cấp từ người dùng trước khi chỉnh sửa bất kỳ một tên file nào hoặc được tăng lên |
file_ext | Đuôi mở rộng của tập tin |
file_size | Kích thước tập tin theo đơn vị kilobyte |
is_image | Tập tin có phải ảnh hay không, 1 là ảnh, 0 không phải ảnh |
image_width | Độ rộng ảnh |
image_height | Độ cao ảnh |
image_type | Kiểu ảnh (thường là phần đuôi mở rộng) |
image_size_str | Chuỗi chứa độ rộng và độ cao ảnh (thường được đặt trong thẻ <img> |
Nguồn: https://codeigniter.com/user_guide/libraries/file_uploading.html
Giải phóng thời gian, khai phóng năng lực