ایجاد فایل فشرده (ZIP) در PHP و کانستراکت
#1
به نام خدا؛
سلام دوستان امیدوارم حالتون خوب باشه...
شاید براتون پیش اومده باشه که بخواین یک یا چند فایل رو در کانستراکت و یا از طریق PHP فشرده کنین. اینکه فایلها رو فشرده کنین علی الخصوص برای هاست یا سرورهایی که فضای ذخیره سازی در حد چند مگ دارن میتونه خیلی مفید باشه. در کنار این مسئله شاید هم بخواین به کاربر به همین شکل خروجی zip بدین. 
اجازه بدین اول این مسئله رو در سمت PHP بررسی کنیم.
کد PHP به این شرحه:
کد php:
<?php
/**
 * @author Master Badfar
 * @copyright 2020
 */
  // قطع نمایش خطاهای مفسر PHP
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
 // تعریف متغیر میزان ارور
 $error 0;
 // تعریف متغیر میزان موفقیت در اضافه کردن فایل 
 $success 0;
 // اگر مقدار تعداد فایلها خالی بود پیغام زیر را نمایش بده و به خطاها اضافه کن
if(empty($_GET['number'])){
        echo "You have not entered the number of files you want to add!";
        $error++;
}
// بررسی عدم موجود بودن فایلها توسط حلقه
for($x 1$x <= $_GET['number']; $x++){  
        $string 
"file" $x;
        // اگر فایل وجود نداشت پیغام زیر را نمایش بده و به تعداد خطاها اضافه کن
        if (!file_exists($_GET[$string])&& !empty($_GET[$string])){
            echo "The entered value for ' " $string " ' is not avialable!" '</br>';
            $error++;
            }elseif(empty($_GET[$string])){
                echo "No files added to ' " $string " ' !" '</br>';
            $error++;
        }
        }
        // هشدار دادن به کاربر در صورت تکراری بودن نام فایل زیپ انتخاب شده
        if (file_exists($_GET['name'])){
            echo "The entered value for the name of the zip file can not be valid because the same file is available in this directory!" '</br>';
        $error++;
        // اگر مقدار پارامتر name خالی بود پیغام زیر را نمایش بده و به تعداد ارورها اضافه کن
        }elseif(empty($_GET['name'])){
            echo '</br>'"You should declare a name for your zip file!" '</br>';
            $error++;
        }
        // نمایش مقدار کلی ارورها 
        if ($error 0){
            echo "The number of total errors that were found is : " $error; 
            
        
}
// ایجاد فایل زیپ جدید
$zip = new ZipArchive;
// باز کردن فایل زیپ جدید و تغییر نام آن به نام انتخابی توسط کاربر
if ($zip->open($_GET['name'], ZipArchive::CREATE) === TRUE)
{
    // تشکیل حلقه و ایجاد پارامترهای فایل
    if ($error == 0){
    for($i 1$i <= $_GET['number']; $i++){
        // اضافه کردن فایلهای تعیین شده به فایل زیپ  
        $string "file" $i;
        $zip->addFile($_GET[$string]);
        $success++;
        }
        }
    // بستن فایل زیپ
    $zip->close();
      // نمایش موفقیت آمیز بودن
      if ($success 0)
        echo "Done." '</br>' "The file ' " $_GET['name'] . ".zip" " ' was successfully created.";
        }
?>
توضیحات راجع به مکانیزم کار کد:
برای استفاده از این کد PHP باید آدرس ریکوئستی مشابه نمونه زیر ارسال کنین.
کد:
http://yourhost.com/file.php?name=x&number=y&file1=example.jpg&file2=voice.amr&...
شما میتونین هر تعداد فایل دلخواه رو در فایل زیپی که قصد دارین بسازین قرار بدین. پارامتر name نام فایل زیپی که ساخته میشه رو مشخص میکنه و پارامتر number تعداد فایلهایی هست که قصد دارین به فایل زیپ خودتون اضافه کنین. پارامترهای file هم در واقع به تعداد فایلهایی که میخواین قابل استفاده هستند. یعنی اگر شما مقدار پارامتر number رو سه تنظیم کرده باشین باید پارامترهای file تا file3 ادامه پیدا کنه. یعنی فرمت ریکوئست با این فرض این شکلی میشه:
کد:
http://yourhost.com/file.php?name=x&number=3&file1=sgad.jpg&file2=sa123.mp3&file3=rwiy.png
دقت کنین که فایل یا فایل های موردنظرتون حتماً توی دایرکتوری که فایل PHP سازنده زیپ قرار داده آپلود شده باشه و موجود باشه. در ضمن نام فایل رو به صورت کامل (به همراه فرمت فایل) باید در آدرس ریکوئست وارد کنین.
توضیحات راجع به پیغام های خطا:
قبل از هر چیز باید بدونید که پیغام های خطا به علامت تعجب ختم میشن. پیغامی که نشان از موفقیت آمیز بودن پروسه باشه به نقطه ختم میشه.
اگر هیچ مقداری برای پارامتر name تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should declare a name for your zip file!
اگر مقداری برای پارامتر number تعریف نشده باشد پیغام زیر نمایش داده می شود:
کد:
You have not entered the number of files you want to add!
اگر مقدار هر یک از پارامترهای file تهی باشد پیغام زیر نمایش داده می شود:
کد:
No files added to ' file(x) ' !
در پیغام بالا عبارت (x) در واقع بیانگر شماره پارامتر file هست.
اگر تعداد ارورهای یافت شده بزرگتر مساوی یک باشد پیغام زیر پس از نمایش دیگر ارورها چاپ می شود:
کد:
The number of total errors that were found is : x
در پیغام فوق عبارت (x) بیانگر تعداد ارورهاست.
اگر مقدار وارد شده برای هر یک از پارامترهای file در دایرکتوری موجود نباشد پیغام زیر نمایش داده می شود:
کد:
The entered value for ' file(x) ' is not avialable!
در پیغام فوق عبارت (x) بیانگر شماره پارامتر file هست.
اگر نام انتخابی برای فایل زیپ (از طریق پارامتر name) در دایرکتوری کنونی موجود باشد پیغام زیر نمایش داده می شود:
کد:
The entered value for the name of the zip file can not be valid because the same file is available in this directory!

کد معکوس (unzip) کردن یک فایل زیپ:
اما شاید بخواین یک فایل زیپ که در دایرکتوری که فایل PHP قرار داره رو از حالت فشرده خارج (unzip) کنین. در این صورت باید از کد زیر استفاده کنین:
کد php:
<?php
/**
 * @author Master Badfar
 * @copyright 2020
 */
  // قطع نمایش خطاهای مفسر PHP
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// متغیر میزان ارور
$error 0;
// متغیر نام دایرکتوری
$directory '';
// بررسی خالی بودن پارامتر zipfile
if(empty($_GET['zipfile'])){
    echo "You should enter the name of your zip file!" '</br>';
    $error++;
    // بررسی موجود بودن فایل زیپ وارد شده توسط کاربر
    }elseif(!file_exists($_GET['zipfile'])){
        echo "The entered file is not available!" '</br>';
        $error++;
        }
        // بررسی خالی بودن پارامتر directory
       if(empty($_GET['directory'])){
            echo "You should enter the name of the directory!" '</br>';
            $error++;
            // بررسی موجود بودن دایرکتوری مشابه
            }elseif(is_dir($_GET['directory'])){
                echo "The entered directory is available!" '</br>';
                $directory $_GET['directory'];
                $error++;
}
// درخواست نام تصادفی برای دایرکتوری 
if($_GET['directory'] == 'random_name'){
    $string "5]4=hA_]_Q8n$7ntW}5boavH*V0syB<Rx=^7B>H=ySu)>]r<p[=ipMkiN]%MmBO)S{B~1vqx4{=F3]vvpn^&}FYmT|wXZHO+BS>cp8eDpFhp^)*Kq~$%QsV3immD4Xj(";
    $directory md5(substr(str_shuffle($string) , mt_rand(0,128) , 10));
    }else{
        $directory $_GET['directory'];
}
// نمایش کـل ارورها
if ($error 0){
     echo "The number of total errors that were found is : " $error; 
}
// پروسه unzip کردن فایل زیپ مورد نظر
if ($error == 0){
$zip = new ZipArchive;
$res $zip->open($_GET['zipfile']);
mkdir($directory);
}
if (
$res === TRUE) {
  $zip->extractTo($directory);
  $zip->close();
  echo "Done." '</br>' "The zip file was successfully extracted in ' " $directory " ' directory.";
}
?>
این کد از شما نام فایل زیپی که قصد دارین از حالت زیپ خارج بشه و دایرکتوری که قصد دارین فایل زیپ در اون اکسترکت (extract) بشه رو دریافت میکنه.
ریکوئستی که به این فایل ارسال میکنین باید به این شکل باشه:
کد:
http://yourhost.com/file.php?zipfile=x&directory=y
در نمونه بالا باید به جای عبارت x در پارامتر zipfile نام فایل زیپ مورد نظرتون رو بدون درج فرمت زیپ قرار بدین. به جای عبارت y برای پارامتر directory میتونین هر عبارتی قرار بدین. اما اگر خواستین یک نام تصادفی برای دایرکتوری که فایلها داخلش اکسترکت (extract) میشن انتخاب بشه باید مقدار پارامتر directory رو دقیقاً با random_name قرار بدین.
توضیحات راجع به پیغام های خطا:
قبل از هر چیز باید بدونید که پیغام های خطا به علامت تعجب ختم میشن. پیغامی که نشان از موفقیت آمیز بودن پروسه باشه به نقطه ختم میشه.
اگر هیچ مقداری برای پارامتر zipfile تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter the name of your zip file!
اگر هیچ مقداری برای پارامتر directory تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter the name of the directory!
اگر دایرکتوری تعیین شده در پارامتر directory از قبل موجود باشد پیغام زیر نمایش داده می شود:
کد:
The entered directory is available!
اگر مقدار تعیین شده برای پارامتر zipfile در دایرکتوری موجود نباشد پیغام زیر نمایش داده می شود:
کد:
The entered file is not available!
اگر تعداد ارورهای یافت شده بزرگتر مساوی یک باشد پیغام زیر پس از نمایش دیگر ارورها چاپ می شود:
کد:
The number of total errors that were found is : x
(عبارت x بیانگر تعداد ارورهای یافت شده است.)
پیاده سازی مکانیزم در محیط کانستراکت:
شاید بخواین فایل یا فایلهای انتخاب شده توسط کاربر رو در یک فایل زیپ قرار بدین. برای این منظور باید از اکشن Invoke download of string شیء Browser استفاده کنین و پارامترهای اکشن رو به شکل زیر تنظیم کنین:
[تصویر:  action_sample.PNG]
امیدوارم از این مطلب لذت برده باشین...
خوشحال میشم نظراتتون رو بیان کنین.
با آروزی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: oak ، shazde ، [email protected] ، M.gh ، amin hosseini
#2
ممنون
[تصویر:  default-yellow.svg]
  پاسخ


 سپاس شده توسط: Master Badfar ، shazde ، M.gh
#3
آقا دمت گرم یه نعمت بزرگ برای انجمن هستی !  3
  پاسخ


 سپاس شده توسط: Master Badfar


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 127 76,075 1402/8/24، 09:00 عصر
آخرین ارسال: mehdiosw
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 17,645 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,139 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 6,988 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100
  رفع مشکل خروجی فونگپ (: M.gh 11 7,298 1400/4/10، 02:17 صبح
آخرین ارسال: oak

پرش به انجمن: