कैसे [पुनरावर्ती] PHP में एक निर्देशिका ज़िप?


118

निर्देशिका कुछ इस तरह है:

home/
    file1.html
    file2.html
Another_Dir/
    file8.html
    Sub_Dir/
        file19.html

मैं PHPMyAdmin http://trac.seagullproject.org/browser/branches/0.6-bugfix/lib/other/Zip.php में उपयोग किए गए समान PHP ज़िप वर्ग का उपयोग कर रहा हूं । मुझे यकीन नहीं है कि कैसे एक फ़ाइल के बजाय एक निर्देशिका को ज़िप करना है। यहाँ मेरे पास अभी तक क्या है:

$aFiles = $this->da->getDirTree($target);
/* $aFiles is something like, path => filetime
Array
(
    [home] => 
    [home/file1.html] => 1251280379
    [home/file2.html] => 1251280377
    etc...
)

*/
$zip = & new Zip();
foreach( $aFiles as $fileLocation => $time ){
    $file = $target . "/" . $fileLocation;
    if ( is_file($file) ){
        $buffer = file_get_contents($file);
        $zip->addFile($buffer, $fileLocation);
    }
}
THEN_SOME_PHP_CLASS::toDownloadData($zip); // this bit works ok

लेकिन जब मैं संबंधित डाउनलोड की गई ज़िप फ़ाइल को अनज़िप करने की कोशिश करता हूं तो मुझे "ऑपरेशन की अनुमति नहीं है"

यह त्रुटि केवल तब होती है जब मैं अपने मैक पर अनज़िप करने की कोशिश करता हूं, जब मैं कमांड लाइन के माध्यम से अनज़िप करता हूं तो फ़ाइल अनज़िप ठीक होती है। क्या मुझे वर्तमान में 'एप्लिकेशन / ज़िप' पर एक विशिष्ट सामग्री प्रकार डाउनलोड करने के लिए भेजने की आवश्यकता है


यह कोड वास्तव में काम करता है - लेकिन किसी कारण से आप इसे मैक ओएस पर अनज़िप नहीं कर सकते हैं (जब तक कि आप सीएलआई अनज़िप का उपयोग न करें)। पीसी पर जिप फाइल अनस्टफ को ओके करती है।
ed209

यह आपकी मदद कर सकता है कोडिंगबीन.com
MKD

जवाबों:


253

यहां एक सरल फ़ंक्शन है जो किसी भी फ़ाइल या निर्देशिका को पुन: संक्षिप्त कर सकता है, केवल ज़िप एक्सटेंशन को लोड करने की आवश्यकता है।

function Zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

इसे इस तरह से कॉल करें:

Zip('/folder/to/compress/', './compressed.zip');

5
बहुत अच्छी तरह से काम किया, मेरा एकमात्र सवाल यह है कि मेरी स्क्रिप्ट एक अलग स्थान से फाइलों तक ज़िपित होने के लिए चलती है, इसलिए जब मैं 1 तर्क प्रदान करता हूं कि ज़िप के भीतर पूर्ण फ़ाइल स्थान का उपयोग किया जाता है, जैसे: C: \ wamp \ www \ निर्यात \ pkg-1211.191011 \ pkg-1211.191011.zip, नया संग्रह के अंदर पूर्ण नेस्टेड फ़ोल्डर संरचना। क्या उपरोक्त स्क्रिप्ट को केवल उन फ़ाइलों और निर्देशिकाओं के अनुकूल बनाने का एक तरीका है, जिन्हें मैं इंगित कर रहा हूं और वे जिस पूर्ण पथ से आते हैं, वह नहीं है?
danjah

4
@ डांजा: मैंने कोड अपडेट कर दिया है, अब * निक्स और विंडोज दोनों के लिए काम करना चाहिए।
एलिक्स एक्सल

5
मुझे आश्चर्य है कि यह क्यों file_get_contentsतार का उपयोग और जोड़ रहा है। फ़ाइलों को सीधे जोड़ने के लिए ज़िप समर्थन नहीं करता है?
10

4
आप सभी को बदलने के लिए '/'साथ DIRECTORY_SEPARATORयह विंडोज पर काम करते हैं, निश्चित रूप से बनाने के लिए। अन्यथा, आप अपने ज़िप में पूर्ण पथ (ड्राइव नाम सहित) के साथ समाप्त करेंगे, उदा C:\Users\...
caw

3
मूल कोड था / टूट गया और बेमानी है। बदलने के लिए कोई ज़रूरत नहीं है //के साथ \ के रूप में यह वास्तव में खिड़कियों पर foreach टूट जाता है। यदि आप बिल्ट-इन का उपयोग करते हैं DIRECTORY_SEPARATOR, तो आपको बदलने की कोई आवश्यकता नहीं है। हार्डकोडिंग वह /है जो कुछ उपयोगकर्ताओं को समस्या हो रही थी। मैं थोड़ा उलझन में था कि मुझे खाली संग्रह क्यों मिल रहा है। मेरा संशोधन * निक्स और विंडोज के तहत ठीक चलेगा।
डेविडशेकर

18

फिर भी एक और पुनरावर्ती निर्देशिका वृक्ष संग्रह, एक विस्तार के रूप में कार्यान्वित किया गया। एक बोनस के रूप में, एक एकल-बयान ट्री संपीड़न सहायक फ़ंक्शन शामिल है। अन्य ZipArchive फ़ंक्शंस में वैकल्पिक स्थानीय नाम का समर्थन किया गया है। जोड़े जाने में त्रुटि कोड ...

class ExtendedZip extends ZipArchive {

    // Member function to add a whole file system subtree to the archive
    public function addTree($dirname, $localname = '') {
        if ($localname)
            $this->addEmptyDir($localname);
        $this->_addTree($dirname, $localname);
    }

    // Internal function, to recurse
    protected function _addTree($dirname, $localname) {
        $dir = opendir($dirname);
        while ($filename = readdir($dir)) {
            // Discard . and ..
            if ($filename == '.' || $filename == '..')
                continue;

            // Proceed according to type
            $path = $dirname . '/' . $filename;
            $localpath = $localname ? ($localname . '/' . $filename) : $filename;
            if (is_dir($path)) {
                // Directory: add & recurse
                $this->addEmptyDir($localpath);
                $this->_addTree($path, $localpath);
            }
            else if (is_file($path)) {
                // File: just add
                $this->addFile($path, $localpath);
            }
        }
        closedir($dir);
    }

    // Helper function
    public static function zipTree($dirname, $zipFilename, $flags = 0, $localname = '') {
        $zip = new self();
        $zip->open($zipFilename, $flags);
        $zip->addTree($dirname, $localname);
        $zip->close();
    }
}

// Example
ExtendedZip::zipTree('/foo/bar', '/tmp/archive.zip', ZipArchive::CREATE);

अच्छा जवाब जियोर्जियो! यह पेड़ की संरचना के लिए खिड़कियों पर जिप () की तुलना में बेहतर परिणाम देता है। धन्यवाद
RafaSashi

11

मैंने अलिक्स एक्सल के उत्तर को तीसरा एग्रीगमेंट लेने के लिए संपादित किया है , जब इस तीसरी एग्रिगमेंट को trueसभी फाइलों को मुख्य निर्देशिका के तहत सीधे ज़िप फ़ोल्डर में जोड़ने के बजाय जोड़ा जाएगा।

अगर जिप फाइल मौजूद है तो फाइल भी डिलीट हो जाएगी।

उदाहरण:

Zip('/path/to/maindirectory','/path/to/compressed.zip',true);

तीसरा argrument trueज़िप संरचना:

maindirectory
--- file 1
--- file 2
--- subdirectory 1
------ file 3
------ file 4
--- subdirectory 2
------ file 5
------ file 6

तीसरी falseसंरचना या अनुपलब्ध ज़िप संरचना:

file 1
file 2
subdirectory 1
--- file 3
--- file 4
subdirectory 2
--- file 5
--- file 6

संपादित कोड:

function Zip($source, $destination, $include_dir = false)
{

    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    if (file_exists($destination)) {
        unlink ($destination);
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }
    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {

        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        if ($include_dir) {

            $arr = explode("/",$source);
            $maindir = $arr[count($arr)- 1];

            $source = "";
            for ($i=0; $i < count($arr) - 1; $i++) { 
                $source .= '/' . $arr[$i];
            }

            $source = substr($source, 1);

            $zip->addEmptyDir($maindir);

        }

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

धन्यवाद! मुझे अपनी स्थिति में मुख्य निर्देशिका को शामिल करने की आवश्यकता थी।
किम स्टैक

आप कार्य केवल मुख्य (रूट) निर्देशिका में काम नहीं कर रहे हैं और कुछ भी नहीं
कृष्णा टोक़

मुझे पता है कि यह बहुत पहले उत्तर दिया गया था। क्या मूल नाम के बजाय 'maindirectory' के लिए एक कस्टम नाम रखना संभव है।
वैभव सिदपारा

@VaibhavSidapara विश्वास है कि $maindirपसंदीदा नाम में परिवर्तन करके संभव होना चाहिए ।
user2019515

महान जवाब, मुझे एक बहुत मदद की। मैंने बहिष्करण को शामिल करने के लिए इस फ़ंक्शन में एक चौथा तर्क जोड़ा। मैं इस प्रश्न के दूसरे उत्तर के रूप में अंतिम कोड जोड़ूंगा।
एल। ऑउलेट

4

उपयोग: thisfile.php? Dir = / path / to / folder (ज़िप करने के बाद, यह डाउनलोड भी शुरू होता है :)

<?php
$exclude_some_files=
array(
        'mainfolder/folder1/filename.php',
        'mainfolder/folder5/otherfile.php'
);

//***************built from https://gist.github.com/ninadsp/6098467 ******
class ModifiedFlxZipArchive extends ZipArchive {
    public function addDirDoo($location, $name , $prohib_filenames=false) {
        if (!file_exists($location)) {  die("maybe file/folder path incorrect");}

        $this->addEmptyDir($name);
        $name .= '/';
        $location.= '/';
        $dir = opendir ($location);   // Read all Files in Dir

        while ($file = readdir($dir)){
            if ($file == '.' || $file == '..') continue;
            if (!in_array($name.$file,$prohib_filenames)){
                if (filetype( $location . $file) == 'dir'){
                    $this->addDirDoo($location . $file, $name . $file,$prohib_filenames );
                }
                else {
                    $this->addFile($location . $file, $name . $file);
                }
            }
        }
    }

    public function downld($zip_name){
        ob_get_clean();
        header("Pragma: public");   header("Expires: 0");   header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false);    header("Content-Type: application/zip");
        header("Content-Disposition: attachment; filename=" . basename($zip_name) . ";" );
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: " . filesize($zip_name));
        readfile($zip_name);
    }
}

//set memory limits
set_time_limit(3000);
ini_set('max_execution_time', 3000);
ini_set('memory_limit','100M');
$new_zip_filename='down_zip_file_'.rand(1,1000000).'.zip';  
// Download action
if (isset($_GET['dir']))    {
    $za = new ModifiedFlxZipArchive;
    //create an archive
    if  ($za->open($new_zip_filename, ZipArchive::CREATE)) {
        $za->addDirDoo($_GET['dir'], basename($_GET['dir']), $exclude_some_files); $za->close();
    }else {die('cantttt');}

if (isset($_GET['dir']))    {
    $za = new ModifiedFlxZipArchive;
    //create an archive
    if  ($za->open($new_zip_filename, ZipArchive::CREATE)) {
        $za->addDirDoo($_GET['dir'], basename($_GET['dir']), $exclude_some_files); $za->close();
    }else {die('cantttt');}

    //download archive
    //on the same execution,this made problems in some hostings, so better redirect
    //$za -> downld($new_zip_filename);
    header("location:?fildown=".$new_zip_filename); exit;
}   
if (isset($_GET['fildown'])){
    $za = new ModifiedFlxZipArchive;
    $za -> downld($_GET['fildown']);
}
?>

2

इस लिंक का प्रयास करें <- अधिक स्रोत कोड यहाँ

/** Include the Pear Library for Zip */
include ('Archive/Zip.php');

/** Create a Zipping Object...
* Name of zip file to be created..
* You can specify the path too */
$obj = new Archive_Zip('test.zip');
/**
* create a file array of Files to be Added in Zip
*/
$files = array('black.gif',
'blue.gif',
);

/**
* creating zip file..if success do something else do something...
* if Error in file creation ..it is either due to permission problem (Solution: give 777 to that folder)
* Or Corruption of File Problem..
*/

if ($obj->create($files)) {
// echo 'Created successfully!';
} else {
//echo 'Error in file creation';
}

?>; // We'll be outputting a ZIP
header('Content-type: application/zip');

// It will be called test.zip
header('Content-Disposition: attachment; filename="test.zip"');

//read a file and send
readfile('test.zip');
?>;

1

यहाँ ज़िप कोड फोल्डर और उसके उप फ़ोल्डर्स और उसकी फाइलों के लिए मेरा कोड है और इसे ज़िप प्रारूप में डाउनलोड करने योग्य बनाते हैं

function zip()
 {
$source='path/folder'// Path To the folder;
$destination='path/folder/abc.zip'// Path to the file and file name ; 
$include_dir = false;
$archive = 'abc.zip'// File Name ;

if (!extension_loaded('zip') || !file_exists($source)) {
    return false;
}

if (file_exists($destination)) {
    unlink ($destination);
}

$zip = new ZipArchive;

if (!$zip->open($archive, ZipArchive::CREATE)) {
    return false;
}
$source = str_replace('\\', '/', realpath($source));
if (is_dir($source) === true)
{

    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

    if ($include_dir) {

        $arr = explode("/",$source);
        $maindir = $arr[count($arr)- 1];

        $source = "";
        for ($i=0; $i < count($arr) - 1; $i++) { 
            $source .= '/' . $arr[$i];
        }

        $source = substr($source, 1);

        $zip->addEmptyDir($maindir);

    }

    foreach ($files as $file)
    {
        $file = str_replace('\\', '/', $file);

        // Ignore "." and ".." folders
        if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
            continue;

        $file = realpath($file);

        if (is_dir($file) === true)
        {
            $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
        }
        else if (is_file($file) === true)
        {
            $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
        }
    }
}
else if (is_file($source) === true)
{
    $zip->addFromString(basename($source), file_get_contents($source));
}
$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$archive);
header('Content-Length: '.filesize($archive));
readfile($archive);
unlink($archive);
}

यदि कोड के साथ कोई समस्या मुझे बताएं।


0

मुझे मैक ओएसएक्स में इस जिप फ़ंक्शन को चलाने की आवश्यकता थी

इसलिए मैं हमेशा उस झुंझलाहट को झकझोरता रहूँगा ।DS_Store

मैंने अतिरिक्तIgnore फ़ाइलों को शामिल करके https://stackoverflow.com/users/2019515/user2019515 को अनुकूलित किया ।

function zipIt($source, $destination, $include_dir = false, $additionalIgnoreFiles = array())
{
    // Ignore "." and ".." folders by default
    $defaultIgnoreFiles = array('.', '..');

    // include more files to ignore
    $ignoreFiles = array_merge($defaultIgnoreFiles, $additionalIgnoreFiles);

    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    if (file_exists($destination)) {
        unlink ($destination);
    }

    $zip = new ZipArchive();
        if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
        }
    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {

        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        if ($include_dir) {

            $arr = explode("/",$source);
            $maindir = $arr[count($arr)- 1];

            $source = "";
            for ($i=0; $i < count($arr) - 1; $i++) { 
                $source .= '/' . $arr[$i];
            }

            $source = substr($source, 1);

            $zip->addEmptyDir($maindir);

        }

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // purposely ignore files that are irrelevant
            if( in_array(substr($file, strrpos($file, '/')+1), $ignoreFiles) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

SO। अनदेखा करना .DS_Store ज़िप से, आप चलाते हैं

zipIt ('/ path / to / folder', '/path/to/compressed.zip', गलत, array ('DS_Store'));


0

महान समाधान लेकिन मेरे विंडोज के लिए मुझे एक संशोधन करने की आवश्यकता है। संशोधित कोड के नीचे

function Zip($source, $destination){

if (!extension_loaded('zip') || !file_exists($source)) {
    return false;
}

$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
    return false;
}

$source = str_replace('\\', '/', realpath($source));

if (is_dir($source) === true)
{
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

    foreach ($files as $file)
    {
        $file = str_replace('\\', '/', $file);

        // Ignore "." and ".." folders
        if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
            continue;

        if (is_dir($file) === true)
        {
            $zip->addEmptyDir(str_replace($source . '/', '', $file));
        }
        else if (is_file($file) === true)
        {

            $str1 = str_replace($source . '/', '', '/'.$file);
            $zip->addFromString($str1, file_get_contents($file));

        }
    }
}
else if (is_file($source) === true)
{
    $zip->addFromString(basename($source), file_get_contents($source));
}

return $zip->close();
}

0

यह कोड विंडो और लाइनक्स दोनों के लिए काम करता है।

function Zip($source, $destination)
{
if (!extension_loaded('zip') || !file_exists($source)) {
    return false;
}

$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
    return false;
}

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    DEFINE('DS', DIRECTORY_SEPARATOR); //for windows
} else {
    DEFINE('DS', '/'); //for linux
}


$source = str_replace('\\', DS, realpath($source));

if (is_dir($source) === true)
{
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
    echo $source;
    foreach ($files as $file)
    {
        $file = str_replace('\\',DS, $file);
        // Ignore "." and ".." folders
        if( in_array(substr($file, strrpos($file, DS)+1), array('.', '..')) )
            continue;

        $file = realpath($file);

        if (is_dir($file) === true)
        {
            $zip->addEmptyDir(str_replace($source . DS, '', $file . DS));
        }
        else if (is_file($file) === true)
        {
            $zip->addFromString(str_replace($source . DS, '', $file), file_get_contents($file));
        }
        echo $source;
    }
}
else if (is_file($source) === true)
{
    $zip->addFromString(basename($source), file_get_contents($source));
}

return $zip->close();
}

0

यहाँ एलिक्स पर मेरा संस्करण आधार है, विंडोज पर काम करता है और उम्मीद है कि निक्स भी:

function addFolderToZip($source, $destination, $flags = ZIPARCHIVE::OVERWRITE)
{
    $source = realpath($source);
    $destination = realpath($destination);

    if (!file_exists($source)) {
        die("file does not exist: " . $source);
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, $flags )) {
        die("Cannot open zip archive: " . $destination);
    }

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

    $sourceWithSeparator = $source . DIRECTORY_SEPARATOR;
    foreach ($files as $file)
    {
        // Ignore "." and ".." folders
        if(in_array(substr($file,strrpos($file, DIRECTORY_SEPARATOR)+1),array('.', '..')))
            continue;

        if (is_dir($file) === true)
        {
            $zip->addEmptyDir(
                str_replace($sourceWithSeparator, '', $file . DIRECTORY_SEPARATOR));
        }
        else if (is_file($file) === true)
        {
            $zip->addFile($file, str_replace($sourceWithSeparator, '', $file));
        }
    }

    return $zip->close();
}

0

यहाँ सरल, पढ़ने में आसान, पुनरावर्ती कार्य है जो बहुत अच्छी तरह से काम करता है:

function zip_r($from, $zip, $base=false) {
    if (!file_exists($from) OR !extension_loaded('zip')) {return false;}
    if (!$base) {$base = $from;}
    $base = trim($base, '/');
    $zip->addEmptyDir($base);
    $dir = opendir($from);
    while (false !== ($file = readdir($dir))) {
        if ($file == '.' OR $file == '..') {continue;}

        if (is_dir($from . '/' . $file)) {
            zip_r($from . '/' . $file, $zip, $base . '/' . $file);
        } else {
            $zip->addFile($from . '/' . $file, $base . '/' . $file);
        }
    }
    return $zip;
}
$from = "/path/to/folder";
$base = "basezipfolder";
$zip = new ZipArchive();
$zip->open('zipfile.zip', ZIPARCHIVE::CREATE);
$zip = zip_r($from, $zip, $base);
$zip->close();

0

@ User2019515 उत्तर के बाद, मुझे अपने संग्रह के बहिष्करण को संभालने की आवश्यकता थी। यहाँ एक उदाहरण के साथ परिणामी फ़ंक्शन है।

ज़िप समारोह:

function Zip($source, $destination, $include_dir = false, $exclusions = false){
    // Remove existing archive
    if (file_exists($destination)) {
        unlink ($destination);
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }
    $source = str_replace('\\', '/', realpath($source));
    if (is_dir($source) === true){
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
        if ($include_dir) {
            $arr = explode("/",$source);
            $maindir = $arr[count($arr)- 1];
            $source = "";
            for ($i=0; $i < count($arr) - 1; $i++) {
                $source .= '/' . $arr[$i];
            }
            $source = substr($source, 1);
            $zip->addEmptyDir($maindir);
        }
        foreach ($files as $file){
            // Ignore "." and ".." folders
            $file = str_replace('\\', '/', $file);
            if(in_array(substr($file, strrpos($file, '/')+1), array('.', '..'))){
                continue;
            }

            // Add Exclusion
            if(($exclusions)&&(is_array($exclusions))){
                if(in_array(str_replace($source.'/', '', $file), $exclusions)){
                    continue;
                }
            }

            $file = realpath($file);
            if (is_dir($file) === true){
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            } elseif (is_file($file) === true){
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    } elseif (is_file($source) === true){
        $zip->addFromString(basename($source), file_get_contents($source));
    }
    return $zip->close();
}

इसे कैसे उपयोग करे :

function backup(){
    $backup = 'tmp/backup-'.$this->site['version'].'.zip';
    $exclusions = [];
    // Excluding an entire directory
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('tmp/'), RecursiveIteratorIterator::SELF_FIRST);
    foreach ($files as $file){
        array_push($exclusions,$file);
    }
    // Excluding a file
    array_push($exclusions,'config/config.php');
    // Excluding the backup file
    array_push($exclusions,$backup);
    $this->Zip('.',$backup, false, $exclusions);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.