Nén cả thư mục thành file Zip với PHP

blogphp25 thg12 2018
PHP

Để bắt đầu làm việc với file Zip, ta cần tạo một đối tượng:
 $zip = new ZipArchive(); 

Sau đó chúng ta mở một file zip mới với tên tùy chọn, mở với chế độ ZipArchive::CREATE (tạo file mới), ở đây mình ví dụ file test.zip ở cùng thư mục hiện tại:
$zip->open('test.zip', ZipArchive::CREATE); 

Sau khi file zip đã được tạo, chúng ta có thể bắt đầu thao tác với file nén này (thêm file mới từ thư mục hiện tại, thêm file mới với nội dung bất kì, tạo thư mục trong file nén...) với các hàm:
$zip->addEmptyDir("$tên_thư_mục") // tạo thư mục bất kì bên trong file zip
$zip->addFile("file_A", [ "tên_file_mới_trong_file_zip" ] ) // copy file A vào trong file zip, có thể đặt tên mới cho file A đó
$zip->addFromString( "tên_file_cần_tạo" , "nội_dung_file" ) // tạo một file mới bên trong file zip với nội dung bất kì

Cuối cùng, khi đã hoàn tất, chúng ta cần đóng file:
$zip->close();


Từ những hàm cơ bản ở trên, ta có thể bắt đầu thiết kế hàm tạo file nén toàn bộ thư mục hiện tại vào trong một file zip:

  1. Tạo thư mục tương ứng trong trong file zip
  2. Duyệt toàn bộ thư mục hiện hành,
  3. Nếu là file add nó vào trong file zip 
  4. Nếu là thư mục con đệ quy gọi lại hàm zip nó từ bước 1
  5. Nếu đã xử lý hết thư mục cha thì kết thúc
Bạn sẽ thấy, ta cần một hàm đệ quy để làm việc này (tất nhiên để duyệt cây thư mục thì phải dùng đệ quy) Sau đây là hàm nén toàn bộ thư mục minh họa giải thuật trên:

function addFolderToZip($zipArchive,$dir,$dirZip){
if(!$handle= opendir($dir)) return;
$zipArchive->addEmptyDir($dirZip);
while($item= readdir($handle)){
if(is_dir("$dir/$item")){
if($item=='.' or $item=='..') continue; else
addFolderToZip($zipArchive,"$dir/$item","$dirZip/$item");
} else {
$zipArchive->addFile("$dir/$item","$dirZip/$item");
}
}
closedir($handle);
}
Cách sử dụng hàm trên như sau:
$zip = new ZipArchive();
$zip->open('test.zip', ZipArchive::CREATE); 
addFolderToZip($zip,'thumuc','thumucZip');
$zip->close();
echo "link to file test.zip for download";

Gửi bài viết tới Facebook

Gửi hình ảnh