چگونه در PHP فایل zip بسازیم؟

چگونه در PHP فایل zip بسازیم؟

معمولا به هنگام انتقال فایل ها به اینترنت، آن ها را فشرده می کنند. این کار چندین مزیت دارد که از مهم ترین آن ها می توان به  کاهش حجم فایل ها و سرعت انتقال بیشتر اشاره کرد.

خوش بختانه کلاس ZipArchive در PHP به ما قابلیت فشرده سازی سریع و آسان فایل ها و پوشه ها را می دهد.

بنابراین در ادامه به چگونگی استفاده از کلاس ZipArchive در PHP برای باز کردن و افزودن فایل ها به یک فایل zip و برخی دیگر از قابلیت های آن اشاره خواهیم کرد.

اولین کسی باشید که به این سؤال پاسخ می‌دهید

نحوه باز کردن یک فایل zip

ابتدا یک شیء از کلاس ZipArchive می سازیم و سپس متد (open ($filename, $flags = null را برای باز کردن یک فایل zip فراخوانی می کنیم.
filename$ نام فایل آرشیویست که قرار است باز شود و flag$ نحوه باز کردن آرشیو را تعیین می کند که می تواند هریک از مقادیر زیر را بپذیرد:
- ZipArchive::CREATE: اگر آرشیو وجود نداشته باشد، آن را ایجاد می کند.
- ZipArchive::OVERWRITE: اگر آرشیو وجود داشته باشد، محتویات آن را نادیده گرفته و مانند آرشیو خالی با آن رفتار می کند.
- ZipArchive::EXCL: اگر آرشیو از قبل وجود داشته باشد، خطا صادر می کند.
- ZipArchive::CHECKCONS: بررسی‌های یکپارچگی بیشتری را روی آرشیو انجام داده و در صورت وجود مشکل، خطا صادر می کند.
- ZipArchive::RDONLY: آرشیو را فقط برای حالت خواندن باز می کند.

بنابراین اگر آرشیوی از قبل وجود نداشته باشد، باید مقدار flag$ را روی ZIPARCHIVE::CREATE تنظیم کنیم تا یک آرشیو با نام مورد نظرمان ایجاد شود. در غیر این صورت flag$ را برابر با ZIPARCHIVE::OVERWRITE تنظیم می کنیم تا در صورتی که یک آرشیو خاص از قبل محتوایی داشته باشد، آن را بازنویسی کند:

<?php

//Create an object from the ZipArchive class.
$zip = new ZipArchive();

//open SamoleZIP.zip for extracting files
$zipfile = 'SampleZIP.zip';

if($zip->open($zipfile, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE) === true){
    echo "Successfully opened.";
}
else{
    echo "Error";
}

?>

در این شبه کد، در صورت وجود فایل، متغیر flag روی OVERWRITE و در غیر این صورت، روی CREATE تنظیم می شود. سپس بررسی می شود که فایل با موفقیت باز شده باشد.


نحوه افزودن پرونده ها به صورت zip


اکنون پس از باز کردن یک فایل zip، می توانیم چندین فایل را در آن اضافه کنیم. برای این کار، متد (addFile ($filename, $localname = null, $start = 0, $length = 0 را فراخوانی می کنیم:

- در این متد پارامتر filename$ مسیر فایلی که قرار است اضافه شود را تعیین می کند و در صورتی که فایلی وجود نداشته باشد، مقدار false برمی گرداند.

- پارامتر localname$ (در صورتی که تنظیم شود)، یک نام جدید به فایل برای ذخیره سازی درون آرشیو می دهد و نام قبلی (filename$) را نادیده می گیرد. (مزیت آن این است که می توان نام اصلی فایل درون سرور را از کاربر پنهان کرد). 

- پارامترهای start$ و length$ (که اغلب استفاده نمی شوند) برای کپی جزئی از فایل مورد نظر تنظیم می شوند. مقدار پیش فرض آن ها صفر است که به معنی کپی کل فایل از ابتدا تا انتهاست.

پس از افزودن همه فایل‌ها به آرشیو، با فراخوانی متد ()close ، فایل بسته شده و تغییرات ذخیره می شوند.

در مثال زیر مسیر فایل های مورد نظر را در یک آرایه ذخیره کرده ایم و پس از باز کردن فایل zip، متد addFile را داخل foreach فراخوانی کرده ایم تا فایل ها به ترتیب اضافه شوند. با فراخوانی متد ()close فایل را بسته و تغییرات را ذخیره کرده ایم:

<?php

$zip = new ZipArchive();

$zipfile = 'SampleZIP.zip';

$filesToAdd = array(
   'documents/SampleText.txt',
   'documents /SamplePdf.pdf',
   'images/SampleImage.png',
);

if($zip->open($zipfile, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE) === true){
   //Add our files to the archive 
   foreach($filesToAdd as $fileToAdd){
	$zip->addFile($fileToAdd);
   }
   $zip->close();
   echo "Zipped successfully."; 
}
else{
    echo "Error";
}

?>


کلاس ZipArchive متدها و ویژگی های زیاد دیگری نیز دارد که از بین آن ها می توان به متد (addFromString ($localname, $contents رای افزودن فایل با یک رشته ورودی و یا متد

(()addGlob ($pattern, $flags = 0, array $options = array

برای ایجاد آرشیوی از فایل هایی که فرمت خاصی دارند (مثلا png یا pdf) اشاره کرد.
همچنین می توانیم به کمک متد

(extractTo ($destination, $entries = null

تمامی یک فایل zip یا برخی از فایل های آن را استخراج کنیم:
- پارامتر destination$ مسیر استخراج فایل ها را تعیین می کند.

پارامتر entries$ فایلی که قرار است استخراج شود را تعیین می کند. در صورتی که مقداری برای این پارامتر در نظر گرفته نشود، همه ی فایل های درون آرشیو استخراج می شوند:

<?php

$zip = new ZipArchive();

if ($zip->open('SampleZIP.zip') === true){
   //will extract only SampleText.txt to given path
   $zip->extractTo('uncompressed/', 'documents/SampleText.txt');
   $zip->close();
   echo "Extract successfully.";
} else {
   echo "Failed to extract file";
}
?>

 
در این مقاله سعی شد چگونگی ایجاد یک فایل zip در PHP را با استفاده از کلاس ZipArchive شرح داده و اشاره ای به برخی از متدها و ویژگی های پرکاربرد آن داشته باشیم. شما می توانید برای مطالعه بیشتر و بررسی دیگر متدهای این کلاس به این سایت مراجعه بفرمایید.

منبع