آموزش کامل کار با zip در PHP ( آرشیو ، اکسترکت ، رمزگذاری )

آموزش کامل کار با zip در PHP ( آرشیو ، اکسترکت ، رمزگذاری )

فایل های zip از آنجایی که در فشرده سازی اطلاعات به ما کامل می کنند کاربرد فراوانی دارند ،

در این آموزش یاد خواهیم گرفت که چگونه فایل ها را zip ، اکسترکت ، رمزگذاری ، ویرایش و جزئیاتی را از آن دریافت کنیم

برای شروع کار نیاز است با کلاس ZipArchive آشنا شوید که تمامی کار ها را با آن انجام می دهیم .

1- فشرده سازی فایل یا همان zip کردن فایل

به 2 روش می توان این عمل را انجام داد

فشرده سازی فایل با داده هایی که در PHP به آن دسترسی داریم

یعنی می توانیم همان رشته یا داده های داخل متغیر را به یک فایل تبدیل کرد و داخل فایل زیپ فشرده کرد .

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename, ZipArchive::CREATE)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$zip->addFromString("content1-" . time() . ".txt", "file number #1\n");
$zip->addFromString("content2-" . time() . ".txt", "file number #2\n");
$zip->setArchiveComment("Archived BY RapidCode.iR");

$zip->close();
?>

open : جهت ساخت یک فایل پوینتر : ورودی اول نام فایل zip که میخواهیم بسازیم و یا از قبل وجود دارد و دومین ورودی که اختیاری است به چه مودی انجام شود مثل CREATE , OVERWRITE و …

addFromString : ساخت فایل با خود PHP و فشرده سازی آن در فایل zip پارامتر اول نام فایل و دومین محتویات آن
setArchiveComment : افزودن کامنت به zip مثال برای زمانی که فایل رمز دارد و رمز آن را در کامنت یادآوری می کنیم .
close : برای بستن فایل پوینتر و برداشتن قفل آن .


دقت داشته باشید در زمانی برای پارامتر دوم open از OVERWRITE استفاده می شود فایل zip قبلی پاک شده و فایل جدید جایگزین آن می شود .


فشرده سازی فایل از قبل تعریف شده در سیستم

<?php

$zip = new ZipArchive();
$archivename = "source.zip";
$unzip_filename = "config/db.php";
$zip_filename = "config/NEW_DB.php";

if ($zip->open($archivename , ZipArchive::CREATE)===TRUE) {
    $zip->addFile($unzip_filename, $zip_filename);
	$zip->close();
}

?>

addFile : ورودی اول مسیر فایل بیرون از zip است و دومین ورودی مسیری که می خواهیم داخل فایل zip قرار بگیرد .

2- دریافت جزئیات فایل zip و محتویات داخل آن

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

echo "filename: " . $zip->filename . "\n";
echo "comment: " . $zip->comment . "\n";
echo "numfiles: " . $zip->numFiles . "\n"; // alias $zip->count()
echo "status code:" . $zip->status . "\n";
echo "status message:" . $zip->getStatusString() . "\n\n";

for ($i=0; $i<$zip->numFiles;$i++) {
    echo "index: $i\n";
    print_r($zip->statIndex($i));
}

$zip->close();
?>

جزئیاتی که برای فایل های داخل زیپ دریافت می کنیم به شکل زیر می باشد :

Array
(
    [name] => content1-1641281392.txt
    [index] => 1
    [crc] => 1929370471
    [size] => 15
    [mtime] => 1641281392
    [comp_size] => 15
    [comp_method] => 0
    [encryption_method] => 0
)


3- خواندن اطلاعات فایل داخل zip بدون اکسترکت ( Stream )

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$fp = $zip->getStream("config/NEW_DB.php");

if(!$fp) die("failed to open stream");

$content = "";

while(!feof($fp) && $content .= fread($fp , 3));

echo $content;

$zip->close();
?>

getStream : نام فایلی که میخواهیم آن را از زیپ دریافت کنیم .

خواندن فایل بدون نیاز به ZipArchive با کمک fopen

<?php

$fp = fopen("zip://" . dirname(__FILE__) ."/source.zip#config/data.txt" , "r");

$content = "";
while(!feof($fp) && $content .= fread($fp , 1));

echo $content;

fclose($fp);
?>


4- اکسترکت ( استخراج ) فایل های ZIP

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$zip->extractTo('./data/'); // extract all
#$zip->extractTo('./data/', array('config/NEW_DB.php')); // extract specific file

$zip->close();
?>

extractTo : اولین پارامتر مسیر استخراج فایل ها است ، دومین پارامتر که اختیاری است فایل هایی می باشد که میخوایم اکسترکت شوند در صورت ندادن این ورودی تمامی فایل ها اکسترکت می شود .

اکسترکت فایل هایی دارای پسورد می باشند

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$zip->setPassword('myp@aSsword');
$zip->extractTo('./data/');

$zip->close();
?>


5- حذف فایل از داخل zip

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$zip->deleteName('config/NEW_DB.php'); 


$zip->close();
?>

deleteName : نام فایلی که میخواهیم از روی زیپ حذف کنیم .

6- تغییر نام فایل داخل zip

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$zip->renameName('config/db.php','config/NEW_DB.php'); 

$zip->close();
?>

renameName : ورودی اول فایلی که میخواهیم نام آن را عوض کنیم دومین ورودی نام جدید فایل

7- جایگزین کردن فایل داخل ZIP

توجه داشته باشید که این ویژگی در نسخه 8 به بعد امکان پذیر است در صورتی از نسخه کمتر از 8 برخوردار هستید می توانید از همان addFile استفاده کنید که قابلیت overwrite دارد .

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$zip->replaceFile('config/a.php',0); 

$zip->close();
?>

replaceFile : ورودی اول مسیر فایل بیرون از زیپ که داخل آن جایگزین می شود و دومین ورودی ایندکس آن است که از 0 شروع می شود .

8- رمزگذاری روی فایل زیپ

<?php
$zip = new ZipArchive();
$archivename = "./source.zip";

if ($zip->open($archivename)!==TRUE) { 
    exit("failed to open <$archivename>\n");
}

$res = $zip->setEncryptionName("config/db.php" , ZipArchive::EM_AES_192 , "myp@aSsword"); 

$zip->close();
?>

setEncryptionName : ورودی 1 نام فایلی که می خواهیم بر روی آن password گذاری کنیم 2- الگوریتم رمزگذاری که از اینجا ثابت هایی که با کلمه EM شروع می شود را برای آن انتخاب کنید 3- رمزعبور مورد نظر برای فایل در صورتی که از setPassword استفاده کردید نیاز به مقدار دادن برای این ورودی نیست .

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

contact us