Advertisement
  1. Code
  2. CodeIgniter

Cách Nén và Giải nén Tập tin trong CodeIgniter

Scroll to top
Read Time: 16 min

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Phần đầu của hướng dẫn này giải thích nhiều cách khác nhau để bạn có thể tạo một tập tin nén bằng các API được tích hợp sẵn của CodeIgniter. Chúng ta sẽ tìm hiểu cách để tạo và lưu các tập tin nén trên máy chủ và đồng thời cách để làm cho chúng có thể được tải về bởi người dùng cuối.

Phần thứ hai bao gồm một cuộc thảo luận về cách bạn có thể giải nén tập tin. Để minh hoạ điều đó, chúng ta sẽ xây dựng một trang tùy biến cho phép người dùng tải lên các tập tin nén sẽ được giải nén trên máy chủ sau khi đã tải lên thành công. Để đạt được tính năng như mong muốn, extension ZipArchive PHP sẽ giúp chúng ta!

Trước khi chúng ta tiếp tục và thật sự đi sâu vào việc phát triển, tôi sẽ liệt kê các tập tin mà chúng ta sẽ phát triển trong suốt hướng dẫn này:

  • application/controllers/Zip.php: Đây là một tập tin controller minh hoạ nhiều cách để bạn có thể tạo một tập tin nén zip.
  • application/controllers/Unzip.php: Đây là một tập tin controller bao gồm code được dùng để giải nén một tập tin do người dùng tải lên.
  • application/views/file_upload_form.php: Đây là một tập tin view có chứa code HTML cơ bản cho form tải lên.
  • application/views/file_upload_result.php: Đây là một tập tin view hiển thị kết quả của một tập tin tải lên bởi người dùng; về cơ bản, nó sẽ cho bạn biết tập tin đã được giải nén thành công hay chưa.
  • application/libraries/Extractor.php: Tập tin này minh hoạ cho khái niệm về một thư viện tuỳ biến trong CodeIgniter.

Với mọi thứ đã sẵn sàng, chúng ta chuyển sang phần tiếp theo thôi!

Cách Nén Tập tin?

Tiếp tục và tạo một tập tin application/controllers/Zip.php với các nội dung sau.

Đó là một tập tin controller khá tiêu chuẩn mà bạn đã quen thuộc. Nó nắm giữ một số phương thức, và mỗi phương thức cho bạn thấy một cách khác nhau để tạo một tập tin nén.

Ngoài ra, nó cung cấp hai phương thức private (riêng tư), _load_zip_lib_archieve_and_download, được gọi từ các phương thức còn lại. Tất nhiên, bạn không cần phải cài đặt các phương thức này, mà chúng ta chỉ tái cấu trúc code của chúng ta để bạn không bị lặp lại cùng một code trong các phương thức khác. Đầu tiên, chúng ta hãy tìm hiểu qua hai phương thức này.

Phương thức _load_zip_lib giống như sau.

Nó nạp thư viện zip được tích hợp sẵn của framework CodeIgniter để bạn có thể sử dụng các tính năng của thư viện đó trong suốt phần còn lại của code. Bây giờ, bạn có thể truy cập thư viện zip với câu lệnh $this->zip.

Tiếp theo, có phương thức _archieve_and_download.

Khi chúng ta đã nạp thư viện zip, bạn có thể sử dụng các phương thức do nó cung cấp. Phương thức archive cho phép bạn tạo một tập tin zip tại đường dẫn được cung cấp như là đối số thứ nhất. Mặt khác, phương thức download sẽ nhắc người dùng tải tập tin xuống.

Đừng lo lắng nếu bạn chưa rõ về nội dung tập tin nén của chúng ta, vì chúng ta sẽ thấy điều đó trong giây lát nữa.

Mọi thứ đều ổn, vì vậy chúng ta đã sẵn sàng để tiếp tục!

Hãy xem code của phương thức data. Phương thức này cho bạn thấy cách để tạo các tập tin một cách nhanh chóng và bọc chúng trong một tập tin zip.

Để bắt đầu, chúng ta gọi phương thức _load_zip_lib để nạp thư viện zip. Tiếp theo, chúng ta sử dụng phương thức add_data của lớp zip cho phép bạn tạo một tập tin và điền nội dung vào nó cùng một lúc! Tất nhiên, nó cũng được thêm vào bộ lưu trữ!

Đối số đầu tiên sẽ là tên của tập tin, và đối số thứ hai nắm giữ nội dung đưa vào tập tin.

Như bạn có thể thấy, chúng ta đã thêm hai tập tin, name.txtprofile.txt, với một số nội dung demo. Cuối cùng, chúng ta gọi _archieve_and_download với my_info.zip như là một đối số của phương thức đó. Nó làm công việc gì?

  • Nó sẽ tạo một tập tin zip my_info.zip trong thư mục uploads của bạn.
  • Nó cũng nhắc người dùng tải tập tin, và tên của tập tin cùng với cái sẽ được lưu là my_info.zip.

Vì vậy, hãy đảm bảo rằng bạn đã tạo thư mục uploads trong thư mục gốc của trang web. Ngoài ra, làm cho nó có thể ghi bởi người dùng máy chủ web. Bây giờ, hãy tiếp tục và chạy "http://my-codeingiter-site/zip/data" để xem mọi thứ đang hoạt động!

Nếu bạn có bất kỳ vấn đề nào, bạn có thể hỏi tôi trong phần ý kiến!

Tiếp theo, phương thức data_array.

Phương thức này giống hệt với phương thức trước mà chúng ta đã thảo luận, ngoại trừ việc chúng ta cung cấp một mảng các tập tin cho phương thức add_data thay vì các tập tin riêng lẻ!

Tiếp theo, hãy lấy code của phương thức data_with_subdirs.

Chỉ trong trường hợp bạn muốn tổ chức các tập tin của bạn trong các thư mục nhất định, thì phương thức add_data cũng cho phép bạn tạo chúng. Đầu ra của phương thức trên sẽ không có gì khác ngoại trừ các tập tin name.txtprofile.txt sẽ được đặt trong thư mục info.

Mặc dù phương thức add_data cung cấp một tính năng thú vị cho phép bạn tạo các tập tin một cách nhanh chóng, nhưng thường thì bạn sẽ không cần phải nén các tập tin hiện có trên máy chủ. Dù sao, đó chính xác là chủ đề của vài phương thức tiếp theo của chúng ta.

Chúng ta hãy nhanh chóng xem phương thức files tiếp theo của chúng ta như thế nào nhé. Nó sẽ tạo một tập tin zip chứa các tập tin nằm trong thư mục uploads.

Mục đích của phương thức read_file là đọc tập tin hiện có trên máy chủ và thêm vào tập tin nén. Vì vậy như bạn có thể thấy, chúng ta đã thêm hai tập tin 1.jpg2.jpg vào tập tin nén. Tất nhiên, hai tập tin đó phải có trong thư mục uploads trong thư mục gốc của trang web.

Nếu bạn truyền TRUE như là đối số thứ hai của phương thức read_file, thì kết quả tập tin zip sẽ giữ nguyên hoàn toàn cấu trúc thư mục mà tập tin đã được lưu vào.

Hãy thử chạy http://my-codeingiter-site/zip/files và kiểm tra kết quả!

Phương thức cuối cùng trong phần này là phương thức dir. Nó sẽ tạo một tập tin nén zip của toàn bộ thư mục.

Bạn có thể sử dụng phương thức read_dir nếu bạn muốn tạo một tập tin nén zip của toàn bộ thư mục thay vì các tập tin nhất định. Trong ví dụ ở trên, nó sẽ tạo một tập tin dir_images.zip có chứa tất cả các tập tin trong thư mục /uploads/images/.

Điều quan trọng cần lưu ý ở đây là toàn bộ cấu trúc thư mục sẽ được giữ nguyên mặc định trong tập tin zip. Nhưng, nếu bạn muốn bỏ qua điều đó, chỉ cần truyền FALSE như là đối số thứ hai của phương thức read_dir. Trong trường hợp đó, nó sẽ chỉ tạo ra một thư mục images trong tập tin zip.

Như vậy là đã kết thúc câu chuyện của chúng ta về cách để tạo một tập tin nén zip bằng các phương thức khác nhau được cung cấp bởi các lớp zip được tích hợp sẵn.

Làm thế nào để Giải nén Tập tin?

Thật không may, không có sẵn thư viện CodeIgniter cho phép chúng ta giải nén các tập tin nén zip. Nhưng extension ZipArchive PHP giúp dễ dàng thực hiện điều đó, như chúng ta sẽ thấy trong giây lát nữa.

Chúng ta sẽ tạo ra một ví dụ khá đơn giản để minh hoạ cách giải nén các tập tin do người dùng tải lên.

Tiếp tục và tạo ra một tập tin application/controllers/Unzip.php với các nội dung sau.

Chúng ta đồng thời hãy tạo các template view của chúng ta, và chúng ta sẽ thấy nó hoạt động với nhau như thế nào.

Hãy tạo một tập tin template cho view application/views/file_upload_form.php với các nội dung sau đây.

Nó tạo ra một form tải lên đơn giản để người dùng có thể tải lên tập tin zip! Xin lưu ý rằng, để cho đơn giản tôi đã giữ cho nó ở mức tối thiểu

Tiếp theo, chúng ta hãy tạo ra tập tin template cho view application/views/file_upload_result.php.

Một khi tập tin đã được tải lên và giải nén, người dùng sẽ được nhìn thấy template trên.

Bây giờ, hãy quay trở lại controller của chúng ta và đi qua từng phương thức.

Trong hàm xây dựng của controller, chúng ta đã nạp các thư viện trợ giúp sẵn có của CodeIgniter là formurl, để chúng ta có thể sử dụng các hàm trợ giúp như form_open_multipart, site_url và các hàm tương tự.

Tiếp theo, hãy nhìn vào phương thức index.

Điều này có cần phải giải thích gì không? Nó gọi view file_upload_form và kết xuất trang. Vì vậy, khi bạn truy cập http://my-codeingiter-site/unzip, nó sẽ hiển thị một form tải lên tập tin đơn giản như được minh hoạ dưới đây.

Ngoài ra, hãy lưu ý rằng hành động của form là unzip/upload nơi dữ liệu sẽ được post. Chúng ta đã sử dụng hàm trợ giúp form_open_multipart để tạo thẻ form nhiều thành phần!

Upload PageUpload PageUpload Page

Tiếp theo, chúng ta cần cài đặt phương thức upload để xử lý việc tải lên và giải nén tập tin. Hãy lấy code của controller Unzip.php.

Nếu bạn đã quen với việc tải lên tập tin trong CodeIgniter, thì code này không có gì đáng sợ đối với bạn. Đối với những người không quen, cũng không có gì phải lo lắng, vì các API tải lên trong CodeIgniter giúp trở nên dễ dàng.

Code sau đây nạp thư viện upload với một số cấu hình ban đầu được cung cấp bởi mảng $config.

Chúng ta đã cấu hình nó sao cho tập tin được tải lên sẽ được đặt trong thư mục uploads trong thư mục gốc của ứng dụng và người dùng chỉ được phép tải lên các tập tin zip.

Tiếp theo, chúng ta đã kiểm tra xem việc tải lên tập có thất bại hay không và nếu nó thất bại, chúng ta sẽ lấy ra một thông báo lỗi hữu ích và gán nó cho biến $params để chúng ta có thể hiển thị nó trong template.

Trong trường hợp, tập tin được tải lên thành công, vì vậy, bước tiếp theo là lấy đường dẫn của tập tin đã tải lên.

Cuối cùng, chúng ta tạo một đối tượng ZipArchive, mở tập tin zip của chúng ta và giải nén nó vào thư mục uploads.

Điều đó không đơn giản sao?

Điều duy nhất mà chúng ta còn sót là gọi đến view file_upload_result, và nó sẽ giống như sau!

Upload Result PageUpload Result PageUpload Result Page

Vậy, đó là phần khác của câu chuyện!

Tái cấu trúc Code Giải nén thành một Thư viện

Bạn sẽ thấy rằng, phương thức upload chứa code của ZipArchive dùng để giải nén tập tin đã tải lên. Sẽ thế nào nếu bạn cần phải sử dụng code đó ở nhiều nơi? Bạn có thể sao chép và dán code khi cần thiết.

Thật ra, có một cách tốt hơn trong đó CodeIgniter cho phép bạn tập trung hoá code có thể được sử dụng xuyên suốt ứng dụng. Bạn có thể tạo thư viện tùy biến.

Tiếp tục và tạo một tập tin application/libraries/Extractor.php với các nội dung sau:

Bây giờ, hãy tiếp tục và thay thế phương thức upload trong controller Unzip.php của bạn bằng phương thức sau đây.

Như bạn có thể thấy, chúng ta đã nạp thư viện tùy biến của chúng ta và sử dụng nó để trích xuất nội dung!

Khá tuyệt, phải không?

Và vâng, đó là phần kết thúc của bài viết này.

Tóm tắt

Tôi hy vọng bạn thích thú với bài viết này, trong đó chúng ta bắt đầu khám phá nhân của thư viện zip của framework CodeIgniter và các cách khác nhau mà bạn có thể tạo một tập tin nén zip. Trong phần thứ hai, tôi giải thích cách bạn có thể giải nén các tập tin do người dùng tải lên bằng extension ZipArchive PHP.

Trong quá trình đó, chúng ta cũng có cơ hội chuyển code của chúng ta thành thư viện CodeIgniter tùy biến và đó là điều gì đó nhỏ nhưng vô cùng hiệu quả mà tôi muốn nói!

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi và đề xuất nào thì bạn có thể để lại nó trong phần bình luận bên dưới.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.