Hướng dẫn dùng open rar trong PHP

Làm sao để thực hiện nén file .zip bằng PHP, bài viết này sẽ giới thiệu và hướng dẫn các bạn thực hiện nén file .zip bằng PHP một cách đơn giản.

Mục lục

    File nén ZiP là gì?

    File có phần mở rộng .zip hiện nay khá phổ biến và hiện nay được hỗ trợ ở hầu hết các hệ điều hành nếu không muốn nói là tất cả.

    File .zip là một dạng file nén dùng giảm dung lượng của một hay nhiều file mà nó chứa bên trong nhằm tối ưu khả năng lưu trữ, di chuyển và truyền tải trên Internet. Sự phổ biến của nó đến mức hiện nay “zip” được xem như một động từ. Ví dụ “Bạn zip file lại rồi gửi cho mình nhé” là một cách nói khá phổ biến cho hành động nén file để giảm dung lượng lưu trữ.

    Ngoài .zip bạn còn có nhiều định dạng khác cũng có chức năng tương tự như .rar , .7z nhưng .zip có lẽ là phổ biến nhất, được sử dụng nhiều nhất và hỗ trợ bởi nhiều hệ điều hành mà không cần cài đặt gì thêm.

    Nén (compress) file trong PHP

    Trong PHP, file .zip có thể tạo hoặc chính sửa thông qua một class được hỗ trợ sẵn là ZipArchive. Quá trình nén và đóng gói file nén sẽ kết thúc khi hàm close() hoặc destroyed() được gọi.

    <?php $zipArchive = new ZipArchive(); // open and create zip file filename data.zip if ($zipArchive->open('data.zip', ZipArchive::CREATE || ZipArchive::OVERWRITE)) { // Add files with text $zipArchive->addFromString('test.txt', 'www.tinhoc88.com'); // Close ZipArchive $zipArchive->close(); } else { printf('Lỗi! mở file.'); exit; } ?>

    Kết quả

    Nén (compress) thư mục trong PHP

    Ngoài nén file thường thì chúng ta rất cần nén thư mục để lưu hành, thực ra việc zip thư mục chỉ là chúng ta code quét tất cả các file trong thư mục và đưa vào file zip, ví dụ code dưới đây sẽ zip 1 thư mục lằm cùng với file thực thi

    <?php // Init ZipArchive $zipArchive = new ZipArchive(); // open and create zip file if ($zipArchive->open('data.zip', ZipArchive::CREATE || ZipArchive::OVERWRITE)) { // get all file $directory="thu-muc-can-nen/"; $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $file) { if(fileperms($path)!="16895") { // $zipArchive->addFile($file); $zipArchive->setEncryptionName($file, ZipArchive::EM_AES_256, 'HieuNT'); } } // Close ZipArchive $zipArchive->close(); } else { printf('Open file error'); exit; } ?>

    Tại đoạn code trên các bạn lưu ý các nội dung sau:

    $directory="thu-muc-can-nen/";

    code này thiết lập thư mục cần nén, lưu ý file thực thi code này lằm cùng thư mục cần nén

    $zipArchive->addFile($file);

    code này sẽ thực hiện thêm từng file vào file zip, lưu ý là tham số $file là đường dẫn của file và phải tồn tại trên hệ thống

    $zipArchive->setEncryptionName($file, ZipArchive::EM_AES_256, 'HieuNT');

    code này là thực hiện thiết lập mật khẩu cho file nén và ở đây mình đang set là 'HieuNT', $file là đường dẫn của file

    và như vậy với đoạn code trên các bạn đã dễ dàng thực hiện nén file dạng .zip kèm theo mật khẩu, nếu các bạn thực hiện mà không hoạt động được có thể liên hệ với chúng tôi để được hỗ trợ.


    Tôi chỉ có thể cho rằng mã của bạn đến từ một hướng dẫn ở đâu đó trực tuyến? Trong trường hợp đó, hãy cố gắng tự mình tìm ra nó. Mặt khác, thực tế là mã này thực sự có thể được xuất bản trực tuyến ở đâu đó như một cách chính xác để giải nén một tệp tin là một điều hơi đáng sợ.

    Nội dung chính

    • LUÔN VỆ SINH ĐẦU VÀO CỦA NGƯỜI DÙNG.
    • Zip 1 folder
    • Cách Nén Tập tin?
    • Làm thế nào để Giải nén Tập tin?
    • Tái cấu trúc Code Giải nén thành một Thư viện

    PHP có các phần mở rộng tích hợp để xử lý các tệp nén. Không cần thiết phải sử dụng systemcuộc gọi cho việc này. ZipArchivetài liệu là một trong những lựa chọn.

    $zip = new ZipArchive; $res = $zip->open('file.zip'); if ($res === TRUE) { $zip->extractTo('/myzips/extract_path/'); $zip->close(); echo 'woot!'; } else { echo 'doh!'; }

    Ngoài ra, như những người khác đã nhận xét, $HTTP_GET_VARSđã không được chấp nhận kể từ phiên bản 4.1 ... đã được xem lại cách đây khá lâu. Đừng sử dụng nó. Sử dụng $_GETsuperglobal để thay thế.

    Cuối cùng, hãy hết sức cẩn thận về việc chấp nhận bất kỳ đầu vào nào được chuyển đến tập lệnh thông qua một $_GETbiến.

    LUÔN VỆ SINH ĐẦU VÀO CỦA NGƯỜI DÙNG.

    CẬP NHẬT

    Theo nhận xét của bạn, cách tốt nhất để giải nén tệp zip vào cùng một thư mục mà nó cư trú là xác định đường dẫn cứng đến tệp và giải nén cụ thể đến vị trí đó. Vì vậy, bạn có thể làm:

    // assuming file.zip is in the same directory as the executing script. $file = 'file.zip'; // get the absolute path to $file $path = pathinfo(realpath($file), PATHINFO_DIRNAME); $zip = new ZipArchive; $res = $zip->open($file); if ($res === TRUE) { // extract it to the path we determined above $zip->extractTo($path); $zip->close(); echo "WOOT! $file extracted to $path"; } else { echo "Doh! I couldn't open $file"; }

    534 hữu ích 5 bình luận chia sẻ

    zip là một định dạng nén phổ biến, được sử dụng để làm giảm dung lượng các định dạng file, để có thể dễ dàng gửi chúng đi nơi khác. PHP sử dụng class ZipArchive để hỗ trợ nén một hoặc nhiều file tới một file zip.
    ZipArchive là class built-in của PHP nên bạn có thể dễ dàng gọi chúng mà không phải thực hiện bất cứ một cài đặt gì.

    Zip 1 file

    <?php // Init ZipArchive $zipArchive = new ZipArchive(); // open zip file if ($zipArchive->open('output/data.zip', ZipArchive::CREATE || ZipArchive::OVERWRITE)) { // Add files if (!$zipArchive->addFile('data/test-1.txt', 'test-1.txt')) { printf("zip file error"); exit; } } else { printf('Open file error'); exit; } // Close ZipArchive $zipArchive->close();

    Kết quả:

    Zip 1 folder

    <?php // Init ZipArchive $zipArchive = new ZipArchive(); // open zip file if ($zipArchive->open('output/data.zip', ZipArchive::CREATE || ZipArchive::OVERWRITE)) { // Add folder $dir = opendir('data/'); while($file = readdir($dir)) { if(is_file("data/${file}")) { if (!$zipArchive->addFile("data/${file}", $file)) { printf("zip file error"); exit; } } } } else { printf('Open file error'); exit; } // Close ZipArchive $zipArchive->close();

    Kết quả:

    Unzip file

    <?php // Init ZipArchive $zipArchive = new ZipArchive(); // open zip file if ($zipArchive->open('output/data.zip')) { // Extracts to current directory $zipArchive->extractTo('./'); } else { printf('Open file error'); exit; } // Close ZipArchive $zipArchive->close();

    Nguồn: vinasupport.com

    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.

    <?php // application/controllers/Zip.php defined('BASEPATH') OR exit('No direct script access allowed'); class Zip extends CI_Controller { private function _load_zip_lib() { $this->load->library('zip'); } private function _archieve_and_download($filename) { // create zip file on server $this->zip->archive(FCPATH.'/uploads/'.$filename); // prompt user to download the zip file $this->zip->download($filename); } public function data() { $this->_load_zip_lib(); $this->zip->add_data('name.txt', 'Sajal Soni'); $this->zip->add_data('profile.txt', 'Web Developer'); $this->_archieve_and_download('my_info.zip'); } public function data_array() { $this->_load_zip_lib(); $files = array( 'name.txt' => 'Sajal Soni', 'profile.txt' => 'Web Developer' ); $this->zip->add_data($files); $this->_archieve_and_download('my_info.zip'); } public function data_with_subdirs() { $this->_load_zip_lib(); $this->zip->add_data('info/name.txt', 'Sajal Soni'); $this->zip->add_data('info/profile.txt', 'Web Developer'); $this->_archieve_and_download('my_info.zip'); } public function files() { $this->_load_zip_lib(); // pass second argument as TRUE if want to preserve dir structure $this->zip->read_file(FCPATH.'/uploads/1.jpg'); $this->zip->read_file(FCPATH.'/uploads/2.jpg'); $this->_archieve_and_download('images.zip'); } public function dir() { $this->_load_zip_lib(); // pass second argument as FALSE if want to ignore preceding directories $this->zip->read_dir(FCPATH.'/uploads/images/'); $this->_archieve_and_download('dir_images.zip'); } }

    Đó 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 và _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.

    private function _load_zip_lib() { $this->load->library('zip'); }

    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.

    private function _archieve_and_download($filename) { // create zip file on server $this->zip->archive(FCPATH.'/uploads/'.$filename); // prompt user to download the zip file $this->zip->download($filename); }

    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.

    public function data() { $this->_load_zip_lib(); $this->zip->add_data('name.txt', 'Sajal Soni'); $this->zip->add_data('profile.txt', 'Web Developer'); $this->_archieve_and_download('my_info.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.txt và profile.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 "//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.

    public function data_array() { $this->_load_zip_lib(); $files = array( 'name.txt' => 'Sajal Soni', 'profile.txt' => 'Web Developer' ); $this->zip->add_data($files); $this->_archieve_and_download('my_info.zip'); }

    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.

    public function data_with_subdirs() { $this->_load_zip_lib(); $this->zip->add_data('info/name.txt', 'Sajal Soni'); $this->zip->add_data('info/profile.txt', 'Web Developer'); $this->_archieve_and_download('my_info.zip'); }

    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.txt và profile.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.

    public function files() { $this->_load_zip_lib(); // pass second argument as TRUE if want to preserve dir structure $this->zip->read_file(FCPATH.'/uploads/1.jpg'); $this->zip->read_file(FCPATH.'/uploads/2.jpg'); $this->_archieve_and_download('images.zip'); }

    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.jpg và 2.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 //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.

    public function dir() { $this->_load_zip_lib(); // pass second argument as FALSE if want to ignore preceding directories $this->zip->read_dir(FCPATH.'/uploads/images/'); $this->_archieve_and_download('dir_images.zip'); }

    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.

    <?php // application/controllers/Unzip.php defined('BASEPATH') OR exit('No direct script access allowed'); class Unzip extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); } public function index() { $this->load->view('file_upload_form'); } public function upload() { $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'zip'; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('zip_file')) { $params = array('error' => $this->upload->display_errors()); } else { $data = array('upload_data' => $this->upload->data()); $full_path = $data['upload_data']['full_path']; /**** without library ****/ $zip = new ZipArchive; if ($zip->open($full_path) === TRUE) { $zip->extractTo(FCPATH.'/uploads/'); $zip->close(); } $params = array('success' => 'Extracted successfully!'); } $this->load->view('file_upload_result', $params); } }

    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.

    <?php // application/views/file_upload_form.php defined('BASEPATH') OR exit('No direct script access allowed'); ?><!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Welcome to CodeIgniter</title> <style type="text/css"> ::selection { background-color: #E13300; color: white; } ::-moz-selection { background-color: #E13300; color: white; } body { background-color: #fff; margin: 40px; font: 13px/20px normal Helvetica, Arial, sans-serif; color: #4F5155; } a { color: #003399; background-color: transparent; font-weight: normal; } h2 { color: #444; background-color: transparent; border-bottom: 1px solid #D0D0D0; font-size: 19px; font-weight: normal; margin: 0 0 14px 0; padding: 14px 15px 10px 15px; } code { font-family: Consolas, Monaco, Courier New, Courier, monospace; font-size: 12px; background-color: #f9f9f9; border: 1px solid #D0D0D0; color: #002166; display: block; margin: 14px 0 14px 0; padding: 12px 10px 12px 10px; } #body { margin: 0 15px 0 15px; } p.footer { text-align: right; font-size: 11px; border-top: 1px solid #D0D0D0; line-height: 32px; padding: 0 10px 0 10px; margin: 20px 0 0 0; } #container { margin: 10px; border: 1px solid #D0D0D0; box-shadow: 0 0 8px #D0D0D0; } div { padding: 10px; } .error { color: #F00; } .success { color: #00F; } </style> </head> <body> <div id="container"> <h2>Upload File</h2> <div id="body"> <div class="success"><?php if (isset($success)) {echo $success;}?></div> <div class="error"><?php if (isset($error)) {echo $error;}?></div> <?php echo form_open_multipart('unzip/upload');?> <div> <input name="zip_file" type="file"/> </div> <div> <input type="submit" value="Upload Zip File" /> </div> </form> </div> </div> </body> </html>

    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.

    <?php // application/views/file_upload_result.php defined('BASEPATH') OR exit('No direct script access allowed'); ?><!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Welcome to CodeIgniter</title> <style type="text/css"> ::selection { background-color: #E13300; color: white; } ::-moz-selection { background-color: #E13300; color: white; } body { background-color: #fff; margin: 40px; font: 13px/20px normal Helvetica, Arial, sans-serif; color: #4F5155; } a { color: #003399; background-color: transparent; font-weight: normal; } h2 { color: #444; background-color: transparent; border-bottom: 1px solid #D0D0D0; font-size: 19px; font-weight: normal; margin: 0 0 14px 0; padding: 14px 15px 10px 15px; } code { font-family: Consolas, Monaco, Courier New, Courier, monospace; font-size: 12px; background-color: #f9f9f9; border: 1px solid #D0D0D0; color: #002166; display: block; margin: 14px 0 14px 0; padding: 12px 10px 12px 10px; } #body { margin: 0 15px 0 15px; } p.footer { text-align: right; font-size: 11px; border-top: 1px solid #D0D0D0; line-height: 32px; padding: 0 10px 0 10px; margin: 20px 0 0 0; } #container { margin: 10px; border: 1px solid #D0D0D0; box-shadow: 0 0 8px #D0D0D0; } div { padding: 10px; } .error { color: #F00; } .success { color: #00F; } </style> </head> <body> <div id="container"> <h2>Upload File Result</h2> <div id="body"> <div class="success"><?php if (isset($success)) {echo $success;}?></div> <div class="error"><?php if (isset($error)) {echo $error;}?></div> <a href="<?php echo site_url('unzip/index'); ?>">&lt;&lt; Back to File Uploader</a> </div> </div> </body> </html>

    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à form và url, để 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.

    public function index() { $this->load->view('file_upload_form'); }

    Đ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 //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!

    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.

    public function upload() { $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'zip'; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('zip_file')) { $params = array('error' => $this->upload->display_errors()); } else { $data = array('upload_data' => $this->upload->data()); $full_path = $data['upload_data']['full_path']; $zip = new ZipArchive; if ($zip->open($full_path) === TRUE) { $zip->extractTo(FCPATH.'/uploads/'); $zip->close(); } $params = array('success' => 'Extracted successfully!'); } $this->load->view('file_upload_result', $params); }

    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.

    $this->load->library('upload', $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.

    $params = array('error' => $this->upload->display_errors());

    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.

    $data = array('upload_data' => $this->upload->data()); $full_path = $data['upload_data']['full_path'];

    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.

    $zip = new ZipArchive; if ($zip->open($full_path) === TRUE) { $zip->extractTo(FCPATH.'/uploads/'); $zip->close(); }

    Đ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!

    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:

    <?php // application/libraries/Extractor.php class Extractor { private $CI = NULL; private $zip = NULL; public function __construct($params = array()) { $this->CI =& get_instance(); $this->zip = new ZipArchive; } public function extract($source_file, $dest_dir) { if ($this->zip->open($source_file) === TRUE) { $this->zip->extractTo($dest_dir); $this->zip->close(); } } }

    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.

    public function upload() { $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'zip'; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('zip_file')) { $params = array('error' => $this->upload->display_errors()); } else { $data = array('upload_data' => $this->upload->data()); $full_path = $data['upload_data']['full_path']; $this->load->library('extractor'); $this->extractor->extract($full_path, FCPATH.'/uploads/'); $params = array('success' => 'Extracted successfully!'); } $this->load->view('file_upload_result', $params); }

    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!

    $this->load->library('extractor'); $this->extractor->extract($full_path, FCPATH.'/uploads/');

    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.

    Chủ đề