توابع موجود در کتابخانه زبان کدنویسی PHP بسیار گسترده و وسیع هستند و برای هر نیازی تقریبا چندین تابع مختلف وجود دارد. یکی از این توابع، استخراج یا همان Extract یا Unzip کردن فایل های فشرده با فرمت zip در فایل منیجر می باشد. اگر کدنویس باشید و درحال طراحی اسکریپتی هستید که نیازدارید یک فایل فشرده در فایل منیجر را Extract کنید و فایل های آن را از حالت فشرده خارج کنید، و یا اینکه قصد دارید یک پوشه یا یک فایل یا تعداد از فایل را با فرمت ZIP فشرده سازی کنید، تابع zip
و unzip
را به شما معرفی می کنیم! با بیتاک همراه باشید.

آموزش تابع zip و فشرده سازی
حالت ساده : کد پیش فرض این تابع
برای فشرده سازی یک یا چندین فایل، شما باید از این کد استفاده کنید:
<?php
$zip = new ZipArchive();
$zip->open('compressed/images.zip', ZipArchive::CREATE);
$zip->addFile('files/1.jpg');
$zip->addFile('files/2.jpg');
$zip->addFile('files/3.jpg);
$zip->addFile('files/4.jpg');
$zip->close();
?>
- قسمت
compressed/images.zip
مربوط به نام فایل و مسیر ذخیره شدن فایل فشرده جدید است.
- هر یک از
$zip->addFile('files/4.jpg');
برای تعریف فایل جدید برای فشرده شدن و قرار گرفتن داخل فایل zip استفاده می شود.
حالت ساده : روش دیگر برای کد قبل
کد بالا را می توان به این صورت هم نوشت:
$zip = new ZipArchive;
if ($zip->open('test_new.zip', ZipArchive::CREATE) === TRUE)
{
// معرفی فایل ها
$zip->addFile('test.txt');
$zip->addFile('test.pdf');
// Add random.txt file to zip and rename it to newfile.txt
$zip->addFile('random.txt', 'newfile.txt');
// Add a file new.txt file to zip using the text specified
$zip->addFromString('new.txt', 'text to be added to the new.txt file');
// All files are added, so close the zip file.
$zip->close();
}
جایگزین کردن فایل فشرده جدید در صورت موجود بودن از قبل
در کدهای قبلی، اگر فایل فشرده جدیدی که قصد داریم ساخته شود از قبل وجود داشته باشد کد عمل نخواهد کرد. اما این کد می تواند فایل قبلی را نادیده گرفته و فایل فشرده جدید را جایگزین فایل قبل کند:
$zip = new ZipArchive;
if ($zip->open('test_overwrite.zip', ZipArchive::OVERWRITE) === TRUE)
{
// Add file to the zip file
$zip->addFile('test.txt');
$zip->addFile('test.pdf');
// All files are added, so close the zip file.
$zip->close();
}
فشرده سازی فایل ها و قرار دادن آنها در کنار فایل ZIP
اگر قصد دارید پس از فشرده شدن فایل ها، آن فایل های فشرده شده در کنار فایل جدید zip ساخته شده، در همان مسیر قرار بگیرند می توانید از این کد استفاده کنید:
$zip = new ZipArchive;
if ($zip->open('test_folder.zip', ZipArchive::CREATE) === TRUE)
{
// Add files to the zip file inside demo_folder
$zip->addFile('text.txt', 'demo_folder/test.txt');
$zip->addFile('test.pdf', 'demo_folder/test.pdf');
// Add random.txt file to zip and rename it to newfile.txt and store in demo_folder
$zip->addFile('random.txt', 'demo_folder/newfile.txt');
// Add a file demo_folder/new.txt file to zip using the text specified
$zip->addFromString('demo_folder/new.txt', 'text to be added to the new.txt file');
// All files are added, so close the zip file.
$zip->close();
}
فشرده سازی فایل ها و انتقال آنها به یک پوشه دیگر در فایل منیجر
اگر میخواهید فایل ها را فشرده کنید سپس فایل هایی که فشرده شده اند به یک پوشه دیگر و دلخواه Move / جابجا شوند از این کد استفاده کنید:
$zip = new ZipArchive;
if ($zip->open('test_folder_change.zip', ZipArchive::CREATE) === TRUE)
{
// Add files to the zip file
$zip->addFile('text.txt', 'demo_folder/test.txt');
$zip->addFile('test.pdf', 'demo_folder1/test.pdf');
// All files are added, so close the zip file.
$zip->close();
}
فشرده سازی تمامی فایل های موجود داخل یک پوشه خاص
اگر قصد دارید تمامی فایل های یک پوشه خاص را فشرده سازی کنید، از این کد استفاده کنید. این کد برای بک آپ گرفتن از پوشه های حساس سایت مفید است:
$zip = new ZipArchive;
if ($zip->open('test_dir.zip', ZipArchive::OVERWRITE) === TRUE)
{
if ($handle = opendir('demo_folder'))
{
// Add all files inside the directory
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != ".." && !is_dir('demo_folder/' . $entry))
{
$zip->addFile('demo_folder/' . $entry);
}
}
closedir($handle);
}
$zip->close();
}
حالت پیشرفته: فشرده کردن فایل ها و پوشه های خاص و موردنظر
در این حالت، تقریبا تمامی کدهای بالا ترکیب شده اند و می توانید پوشه ها و فایل های خاص را بطور همزمان فشرده سازی کنید:
$zip = new ZipArchive;
if ($zip->open('test_files_dirs.zip', ZipArchive::OVERWRITE) === TRUE)
{
// Add directory1
if ($handle = opendir('demo_folder/directory1/'))
{
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != "..")
{
$zip->addFile('demo_folder/directory1/' . $entry);
}
}
closedir($handle);
}
// Add directory2
if ($handle = opendir('demo_folder/directory2/'))
{
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != "..")
{
$zip->addFile('demo_folder/directory2/' . $entry);
}
}
closedir($handle);
}
// Add directory3
if ($handle = opendir('demo_folder/directory3/'))
{
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != "..")
{
$zip->addFile('demo_folder/directory3/' . $entry);
}
}
closedir($handle);
}
// Add more files
$zip->addFile('demo_folder/index.txt');
$zip->close();
}
کدهای بالا به همین صورتی که هستند شاید قابل استفاده نباشند و طبیعتا برای تطبیق دادن با کدهای پروژه خودتان باید شخصی سازی انجام دهید. با توجه به حساس بودن این توابع، اگر دانش کدنویسی ندارید حتما از یک کدنویس کمک بگیرید تا باعث ایجاد باگ امنیتی در سایت خود نشوید.
آموزش تابع unzip و استخراج فایل فشرده
در کدهای قبلی با نحوه فشرده سازی فایل ها آشنا شدید، اکنون قصد داریم نحوه استخراج کردن و به اصطلاح آنزیپ کردن فایل zip را به شما آموزش دهیم. این تابع مخصوص زمانی است که بخواهید یک فایل فشرده را در یک مسیری مشخص، Extract کنید.
$zip = new ZipArchive;
$res = $zip->open('file.zip'); // فایل موردنظر که قصد استخراج کردنش را دارید
if ($res === TRUE) {
$zip->extractTo('/myzips/extract_path/'); // مسیری که باید فایل در آنجا استخراج شود
$zip->close();
echo 'انجام شد';
} else {
echo 'عملیات انجام نشد';
}
- در کد
$res = $zip->open('file.zip');
باید فایل یا مسیر آن را بطور دقیق مشخص کنید.
- در خط
$zip->extractTo('/myzips/extract_path/');
مسیری که فایل فشرده باید در آنجا استخراج شود را وارد کنید.
استخراج کردن در مسیر فعلی
اگر قصد دارید فایل فشرده موردنظر را در همان مسیری که فایل فشرده قرار دارد استخراج کنید، از این کد استفاده کنید:
// مشخص کردن فایل موردنظر برای استخراج شدن
$file = 'file.zip';
// دریافت آدرس فعلی فایل تعریف شده
$path = pathinfo(realpath($file), PATHINFO_DIRNAME);
$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
// استخراج در مسیری که فایل فشرده در آن قرار دارد
$zip->extractTo($path);
$zip->close();
echo "انجام شد";
} else {
echo "عملیات انجام نشد";
}