Nén danh mục và tự động tải xuống bằng Zip

PHP & MySQL 04/10/2017 07:00 635
Trong bài này, mình sẽ giới thiệu cho các bạn cách làm thế nào để nén toàn bộ thư mục và sau đó tự động tải file zip bằng PHP. Điều này có thể hữu ích cho việc bạn có thể tạo bản sao lưu trang web hoặc cho phép khách truy cập tải xuống các nhóm tệp (ví dụ: ảnh trong danh mục, video,....).

1. Class Zip

Để bắt đầu, chúng ta sẽ tạo một Class ZIP - Xây dựng các phương thức chúng ta sẽ sử dụng:

class zip
{
   private $zip;
   public function __construct( $file_name, $zip_directory)
   {
        $this->zip = new ZipArchive();
        $this->path = dirname( __FILE__ ) . $zip_directory . $file_name . '.zip';
        $this->zip->open( $this->path, ZipArchive::CREATE );
    }
      
   /**
     * Get the absolute path to the zip file
     * @return string
     */
    public function get_zip_path()
    {
        return $this->path;
    }   
       
    /**
     * Add a directory to the zip
     * @param $directory
     */
    public function add_directory( $directory )
    {
        if( is_dir( $directory ) && $handle = opendir( $directory ) )
        {
            $this->zip->addEmptyDir( $directory );
            while( ( $file = readdir( $handle ) ) !== false )
            {
                if (!is_file($directory . '/' . $file))
                {
                    if (!in_array($file, array('.', '..')))
                    {
                        $this->add_directory($directory . '/' . $file );
                    }
                }
                else
                {
                    $this->add_file($directory . '/' . $file);                }
            }
        }
    }
   
    /**
     * Add a single file to the zip
     * @param string $path
     */
    public function add_file( $path )
    {
        $this->zip->addFile( $path, $path);
    }
   
    /**
     * Close the zip file
     */
    public function save()
    {
        $this->zip->close();
    }
}

1.1 Hàm khởi tạo __construct().

Hàm khởi tạo với hai tham số, tên tệp tin zip & thư mục mà chúng ta muốn lưu trữ. Sử dụng ZipArchive của PHP chúng ta tạo và mở tệp zip bất kỳ.

1.2 Hàm get_zip_path()

Phương pháp get_zip_path cho phép chúng ta nhận lại được đường dẫn đầy đủ đến file zip, chúng ta sẽ sử dụng hàm này cho yêu cầu tải xuống.

1.3 Hàm add_directory()

Tiếp theo, chúng ta tạo một phương thức add_directory để truyền trong thư mục mà chúng ta muốn nén. Trong phương pháp này, chúng ta tạo ra một thư mục mở để xử lý thông qua các thư mục con và các tập tin trong thư mục. Chúng ta kiểm tra xem sự lặp lại hàm hiện tại cho một thư mục con, hoặc cho một tệp tin, trong trường hợp đó gọi phương thức add_file để thực sự thêm vào tệp zip.

Cũng lưu ý rằng chúng ta sử dụng 'addEmptyDirectory' được dùng để sao chép cùng một cấu trúc thư mục.

1.4 Hàm add_file

Bây giờ chúng ta tạo ra phương thức 'add_file' để thực hiện việc thêm tập tin vào zip. Điều này được gọi từ phương thức add_directory nhưng cũng có thể được gọi trực tiếp. Vì vậy chúng ta làm cho công cụ này trở nên công khai. Để thêm tệp chúng ta sử dụng chức năng addFile của ZipArchive.

2. Tạo một File Zip.

Bây giờ chúng ta đã có một Class Zip chúng ta có thể tạo một file zip như sau:

$zip_name = 'zip_' . time();
$zip_directory = '/';
$zip = new zip( $zip_name, $zip_directory );
$zip->add_directory( 'files' );
$zip->save();
3.Tự động download tệp

Để bắt đầu tự động tải tệp zip, chúng ta cần có được đường dẫn zip từ class zip, đặt tên tệp và sau đó sử dụng 'readfile' để xuất nội dung của zip.

$zip_path = $zip->get_zip_path();
header( "Pragma: public" );
header( "Expires: 0" );
header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
header( "Cache-Control: public" );
header( "Content-Description: File Transfer" );
header( "Content-type: application/zip" );
header( "Content-Disposition: attachment; filename=\"" . $zip_name . "\"" );
header( "Content-Transfer-Encoding: binary" );
header( "Content-Length: " . filesize( $zip_path ) );
readfile( $zip_path );

Nếu bạn đang sử dụng phương pháp này cho một số tính năng như sao lưu trang web, backup database thì bạn cần phải thêm một số tính năng bảo mật như htaccess hoặc đặt mật khẩu để bảo vệ thư mục để đảm bảo rằng nó không thể truy cập một cách tự tiện được.

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.