CodeIgnitor: Lớp Upload File

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
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ố:
  • $config (array) – Các tùy chọn
  • $reset (bool) – Thiết lập lại các tùy chọn (không có trong $config) hay không
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.

Lưu ý
Mặc định thì việc upload tập tin từ một trường của form sẽ được gọi là userfile, và form phải có kiểu "multipart"
<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ố:
  • $open (string) – Thẻ mở
  • $close (string) – Thẻ đóng
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

» Tiếp: Lớp Shopping Cart
« Trước: Lớp Pagination
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!