ساخت فایل فشرده به وسیله PHP

اردیبهشت ۱, ۱۳۹۱ توسط : سعید

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

/* creates a compressed zip file */
function create_zip($files = array(),$destination = '',$overwrite = false) {
	//if the zip file already exists and overwrite is false, return false
	if(file_exists($destination) && !$overwrite) { return false; }
	//vars
	$valid_files = array();
	//if files were passed in...
	if(is_array($files)) {
		//cycle through each file
		foreach($files as $file) {
			//make sure the file exists
			if(file_exists($file)) {
				$valid_files[] = $file;
			}
		}
	}
	//if we have good files...
	if(count($valid_files)) {
		//create the archive
		$zip = new ZipArchive();
		if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
			return false;
		}
		//add the files
		foreach($valid_files as $file) {
			$zip->addFile($file,$file);
		}
		//debug
		//echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;

		//close the zip -- done!
		$zip->close();

		//check to make sure the file exists
		return file_exists($destination);
	}
	else
	{
		return false;
	}
}

براس استفاده از این تابع باید به صورت زیر عمل کنیم :

$files_to_zip = array(
	'preload-images/1.jpg',
	'preload-images/2.jpg',
	'preload-images/5.jpg',
	'kwicks/ringo.gif',
	'rod.jpg',
	'reddit.gif'
);
//if true, good; if false, zip creation failed
$result = create_zip($files_to_zip,'my-archive.zip');

پارامتر اول نام فایلها به صورت آرایه ، پارامتر دوم نام فایل ZIp و پارامتر سوم اگر true باشه و اگر فایل فشرده از قبل موجود باشه overwrite میکنه.

منبع : http://davidwalsh.name/create-zip-php

بازدید : ۵۷۵۴

wandad
اردیبهشت ۳, ۱۳۹۱ @ ۹:۲۶ ب.ظ

آقا سعید یه سوال:خط ۴ که در صورت موجود فایل یه فالس بر می گردونه در واقع مقدار تابع فالس میشه؟
و ادامه ی کد اجرا نمیشه؟

پاسخ دادن
    سعید
    اردیبهشت ۳, ۱۳۹۱ @ ۱۰:۳۹ ب.ظ

    اگه توی کامنت ها نگاه کنی توضیحاتش رو نوشته.این خط چک میکنه که اگر فایل از قبل موجود بود اما نخواستیم overwrite کنیم false برمیگردونه.

    پاسخ دادن
wandad
اردیبهشت ۳, ۱۳۹۱ @ ۹:۴۴ ب.ظ

میشه لطف کنین راجع به خط ۲۱ یه توضیح بدین.

پاسخ دادن
    سعید
    اردیبهشت ۳, ۱۳۹۱ @ ۱۰:۴۵ ب.ظ

    همینطور که توی توضیحات گفتم پارامتر سومی که به تابع میفرستیم true یا false که اگر true باشه فایل رو overwrite میکنه.در خط ۲۱ در قسمت زیر :

    $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE
    

    چک میکنه اگر متغیر$overwrite برابر با true بود فایل رو اگر از قبل موجود باشه overwrite میکنه در غیر اینصورت یک فایل جدید میسازه.در ادامه :

    $zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true)
    

    اگر فایل zip رو نتونست بسازه false برمیگردونه در غیر اینصورت فایلهایی که به تابع ارجاع دادیم رو به فایل zip اضافه میکنه.
    موفق باشی

    پاسخ دادن
wandad
اردیبهشت ۳, ۱۳۹۱ @ ۱۱:۲۳ ب.ظ

ممنونم.

پاسخ دادن
wandad
اردیبهشت ۱۲, ۱۳۹۱ @ ۱۱:۴۳ ق.ظ

saeed jan ye soal, dalile neveshtane khate 6 chi bood?nemizasht ham script kare khodesho mikard

پاسخ دادن
wandad
اردیبهشت ۱۲, ۱۳۹۱ @ ۱۲:۰۶ ب.ظ

khate 26 ham $file 2bar tekrar shode ,chera?

پاسخ دادن
پیمان
مرداد ۱۱, ۱۳۹۱ @ ۱۰:۴۸ ب.ظ

سلام خیلی عالی بود. من یک تابعی دارم که یک پوشه را با تمامی محتویاتش zip میکنه به نظر من خیلی مفیده:

/*
        $fileName => نام فایل یا پوشه مورد نظر جهت فشرده کردن آن
        $zipFileName => نام مورد نظر برای فایل فشرده ایجاد شده
    */
    function create_zip($fileName,$zipFileName)
    {
        $zip = new ZipArchive();
        if(file_exists($fileName) or is_dir($fileName))
        {
            $zip_archive = $zip->open($zipFileName,ZIPARCHIVE::CREATE);
            if($zip_archive === true)
            {
                $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fileName));
                foreach ($iterator as $key=>$value)
                {
                    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
                }
                $zip->close();
                return true;
            }
        }
        else
        {
            return false;
        }
    }

حالا خیلی ممنون می شم اگه بهم بگید که چجوری می تونم در زمانی که داره پوشه من zip میشه یا zip شده، یک پسوورد هم برای فایل zip بگذارم؟
من با دستور

system("zip -P $password $outfile $infile");

تست کردم اما خوب فکر کنم به خاطر $infile نمی تونه این کار را انجام بده!

پاسخ دادن
    سعید
    مرداد ۱۱, ۱۳۹۱ @ ۱۱:۳۸ ب.ظ

    ممنون از کدتون

    دلیل اینکه نتونستید جواب بگیرید فکر میکنم بیشتر به دلیل اینه که دستور system روی هاستها غیر فعاله.

    پاسخ دادن
Mitra
دی ۱۵, ۱۳۹۳ @ ۱:۴۳ ب.ظ

خیلی ممنون
کدتونم هیچ مشکلی نداشت ، تست کردم اجرا شد.

پاسخ دادن

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


*