Giới thiệu và sử dụng lớp Zip Encode trên CodeIgniter

Lớp Zip Encode trên CodeIgniter cho phép bạn có thể tạo các file lưu trữ dạng Zip. Và các file này có thể được tải về máy tính. Chúng ta sẽ đi qua các phương thức của lớp Zip Encode này để xem cách hoạt động của chúng.

1. Load Class Zip Encode.

Khi muốn gọi lớp Zip Encode trên CodeIgniter, chúng ta sử dụng hàm $this->load->library().

$this->load->library('zip');

Sau khi gọi lớp này lên, ta có thể truy cập vào Zip Object thông qua hàm $this->zip.

Ví dụ về cách dùng lớp Zip Encode để nén một file, lưu nó vào một thư mục trên Server hoặc là tải nó về Desktop.

$name = 'mydata1.txt'; // File nguồn
$data = 'A Data String!'; // Nội dung của file
$this->zip->add_data($name, $data); // Chuyển nội dung vào file
// Ghi file zip này vào một thư mục trên Server. Đặt tên là "my_backup.zip"
$this->zip->archive('/path/to/directory/my_backup.zip'); 
// Tải file zip này về Desktop . Đặt tên nó là "my_backup.zip"
$this->zip->download('my_backup.zip');

2. Các hàm tham chiếu.

a. Hàm $this->zip->add_data().

Hàm này cho phép ta chèn dữ liệu vào file Zip. Các tham số bao gồm

  • Tham số 1 : Tên của file sẽ đưa dữ liệu vào.
  • Tham số 2 : Là chuỗi nội dung.

Ví dụ :

$name = 'my_bio.txt';
$data = 'Hello World ! I am a PHP developer ...';
$this->zip->add_data($name, $data);

Ta có thể gọi nhiều lần để có thể chèn được nhiều file hơn. Ví dụ :

$name = 'mydata1.txt';
$data = 'Nội dung thứ nhất !';
$this->zip->add_data($name, $data);
$name = 'mydata2.txt';
$data = 'Nội dung thứ hai !';
$this->zip->add_data($name, $data);

Có thể truyền theo mảng như sau :

$data = array(
                'mydata1.txt' => 'Nội dung thứ nhất !',
                'mydata2.txt' => 'Nội dung thứ hai !'
            );
$this->zip->add_data($data);
$this->zip->download('my_backup.zip');

Nếu bạn muốn nén file trong một thư mục cấp con, thì thay vì truyền tên file các bạn truyền đường dẫn của file vào tham số thứ 1.

$name = 'personal/my_bio.txt';
$data = 'I was born in an elevator...';
$this->zip->add_data($name, $data);

File my_bio.txt sẽ được đặt vào trong thư mục personal.

b. Hàm $this->zip->add_dir().

Hàm này cho phép ta chèn một thư mục. Thông thường hàm này là không cần thiết khi mà bạn muốn đặt dữ liệu vào thư mục nào đó bằng sử dụng hàm $this->zip->add_data().

Nhưng nếu bạn muốn tạo ra một thư mục trống thì phải dùng hàm này. Ví dụ :

$this->zip->add_dir('myfolder'); // Tạo một thư mục tên là "myfolder"

c. Hàm $this->zip->read_file().

Hàm này cho phép bạn nén một file đã tồn tại ở đâu đó trên Server. 

$path = '/path/to/photo.jpg';
$this->zip->read_file($path); 
// Tải file về Desktop và đặt tên là "my_backup.zip"
$this->zip->download('my_backup.zip');

e. Hàm $this->zip->read_dir().

Hàm này cho phép ta nén một thư mục (kèm nội dung chứa trong thư mục này) đã tồn tại đâu đó trên Server. Tham số là đường dẫn tới thư mục cần nén, lớp Zip Encode sẽ đọc theo quy tắc đệ quy (đọc cả những thư mục con) của thư mục này và tái tạo lại nó dưới định dạng file Zip.

Tất cả file chứa trong thư mục nguồn sẽ được mã hóa. Ví dụ

$path = '/path/to/your/directory/';
$this->zip->read_dir($path); 
$this->zip->download('my_backup.zip');

Theo mặc định thì lớp Zip sẽ đặt tất cả thư mục ở tham số thứ nhất vào trong file zip này. Nếu bạn không muốn sắp xếp theo cấp bậc kiểu cây thư mục, thì truyền vào tham số thứ hai là FALSE.

Ví dụ :

$path = '/path/to/your/directory/';
$this->zip->read_dir($path, FALSE);

Hàm này sẽ tạo một file Zip với thư mục directory được chứa ở trong, rồi đến tất cả thư mục con của nó, nhưng sẽ không chứa các thư mục /path/to/your.

f. Hàm $this->zip->archive().

Hàm này ghi một file Zip được mã hóa vào một thư mục trên Server. Bạn phải chắc chắn là thư mục có quyền được ghi (666 hoặc 777).

$this->zip->archive('/path/to/folder/myarchive.zip'); // Tạo một file tên là myarchive.zip

g. Hàm $this->zip->download().

Dùng để download file Zip từ Server về máy Desktop. 

$this->zip->download('latest_stuff.zip'); // File được đặt tên là "latest_stuff.zip"

Chú ý : Đừng nên hiển thị bất kể dữ liệu nào trong Controller có gọi đến hàm này vì nó sẽ gửi rất nhiều Server Header đi , và có thể bị tải về và xử lý giống mã nhị phân. Chủ yếu là lý do bảo mật.

h. Hàm $this->zip->get_zip().

Hàm này trả về file nén dữ liệu. Nhìn chung thì ta không cần dùng hàm này trừ khi muốn làm gì đó chỉ với dữ liệu này. Ví dụ :

$name = 'my_bio.txt';
$data = 'I was born in an elevator...';
$this->zip->add_data($name, $data);
$zip_file = $this->zip->get_zip();

i. Hàm $this->zip->clear_data().

Lớp Zip Encode này sẽ cache - tạo bộ đệm dữ liệu của bạn vì vậy nó sẽ không cần phải biên dịch lại đối với từng hàm khi được sử dụng. Tuy vậy, nếu bạn cần tạo nhiều file Zip, mỗi cái có nhiều dữ liệu, thì bạn cần phải xóa bộ đệm giữa các lần gọi đi. Ví dụ :

$name = 'my_bio.txt';
$data = 'Nội dung file ...';
$this->zip->add_data($name, $data);
$zip_file = $this->zip->get_zip();
$this->zip->clear_data(); 
$name = 'photo.jpg';
$this->zip->read_file("/path/to/photo.jpg"); // Đọc nội dung của file

Trên đây là toàn bộ các hàm của lớp Zip Encode trên CodeIgniter cho đến thời điểm hiện tại. Lớp này khá hữu ích khi ta thường cần nén dữ liệu để lưu trên Server, vừa dễ quản lý, vừa bảo mật hệ thống hơn.

Chúc các bạn thành công :)

Tags: