কীভাবে [পুনরাবৃত্তভাবে] পিএইচপি-তে একটি ডিরেক্টরি জিপ করবেন?


118

ডিরেক্টরি হ'ল কিছু:

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

আমি পিএইচপিএমআইএডমিন http://trac.seagullproject.org/browser/branches/0.6-bugfix/lib/other/Zip.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

এই আপনাকে সহায়তা করতে পারে codingbin.com/compressing-a-directory-of-files-with-php
ম্যাসেডোনিয়ানে

উত্তর:


254

এখানে একটি সাধারণ ফাংশন যা কোনও ফাইল বা ডিরেক্টরিকে পুনরাবৃত্তভাবে সংকুচিত করতে পারে, কেবল জিপ এক্সটেনশন লোড করা দরকার।

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
খুব ভালভাবে কাজ করেছেন, আমার একমাত্র প্রশ্ন হ'ল আমার স্ক্রিপ্টটি আলাদা অবস্থান থেকে ফাইলগুলি জিপ করার জন্য চালিত হয়, তাই আমি যখন প্রথম তর্কটি সরবরাহ করি যে পুরো ফাইলপথের অবস্থানটি জিপের মধ্যে ব্যবহৃত হয়, যেমন: সি: \ wamp \ www \ এক্সপোর্ট করুন \ pkg-1211.191011 \ pkg-1211.191011.zip, সেই পূর্ণ নেস্টেড ফোল্ডার কাঠামোটি নতুন সংরক্ষণাগারের অভ্যন্তরে রয়েছে। উপরের স্ক্রিপ্টটি কেবলমাত্র যে ফাইলগুলি এবং নির্দেশিকাগুলি আমি নির্দেশ করছি সেগুলি অন্তর্ভুক্ত করার কোনও উপায় আছে, এবং সেগুলি থেকে আসা পুরো পথটি কী নয়?
দানজাহ

4
@ দানজাহ: আমি কোডটি আপডেট করেছি, এখন * নিক্স এবং উইন্ডোজ উভয়ের জন্যই কাজ করা উচিত।
অ্যালিক্স অ্যাক্সেল

5
আমি অবাক হচ্ছি কেন এটি file_get_contentsস্ট্রিং ব্যবহার করছে এবং যুক্ত করছে। জিপ সমর্থন করে না সরাসরি ফাইল যুক্ত?
hakre

4
আপনি সমস্ত প্রতিস্থাপন আছে '/'সঙ্গে DIRECTORY_SEPARATORএটা Windows এ কাজ, অবশ্যই না। অন্যথায়, আপনি আপনার জিপতে সম্পূর্ণ পথ (ড্রাইভের নাম সহ) সমাপ্ত করবেন, যেমন C:\Users\...
কাওয়

3
আসল কোডটি ছিল / নষ্ট এবং অপ্রয়োজনীয়। প্রতিস্থাপন করার কোন প্রয়োজন নেই //সঙ্গে \ হিসাবে এই আসলে Windows এ foreach বিরতি। আপনি যদি বিল্ট-ইনটি আপনার যেমনভাবে ব্যবহার করেন তবে DIRECTORY_SEPARATORপ্রতিস্থাপনের দরকার নেই। এর হার্ডকোডিং হ'ল /কিছু ব্যবহারকারীদের সমস্যা দেখা দিয়েছে। আমি কেন একটি খালি সংরক্ষণাগার পাচ্ছি তা নিয়ে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম। আমার রিভিশনটি * নিক্স এবং উইন্ডোজ এর অধীনে সূক্ষ্মভাবে চলবে।
ডেভিডশেয়ার

18

জিপআরচাইভের এক্সটেনশন হিসাবে প্রয়োগ করা হয়েছে এমন আরও একটি পুনরাবৃত্ত ডিরেক্টরি ডিরেক্টরি গাছ সংরক্ষণাগার। বোনাস হিসাবে, একটি একক বিবরণ ট্রি সংক্ষেপণ সহায়ক ফাংশন অন্তর্ভুক্ত করা হয়। অন্যান্য জিপআর্কাইভ ফাংশনগুলির মতো Oচ্ছিক স্থানীয় নাম সমর্থিত। কোড হ্যান্ডলিংয়ে ত্রুটি যুক্ত করা হবে ...

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);

দুর্দান্ত উত্তর জর্জিও! এটি গাছের কাঠামোর জন্য উইন্ডোগুলিতে জিপ () এর চেয়ে ভাল ফলাফল দেয়। ধন্যবাদ
রাফাশী

11

তৃতীয় তর্ক করার জন্য আমি অ্যালিক্স অ্যাক্সেলের উত্তর সম্পাদনা করেছি , যখন trueসমস্ত ফাইলগুলিতে এই তৃতীয় তর্কটি সেট করার সময় সরাসরি জিপ ফোল্ডারে না গিয়ে মূল ডিরেক্টরিতে যুক্ত করা হবে।

জিপ ফাইল উপস্থিত থাকলে ফাইলটিও মুছে ফেলা হবে।

উদাহরণ:

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

তৃতীয় আর্গুমেন্ট 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();
}

ধন্যবাদ! আমার পরিস্থিতির মূল ডিরেক্টরিটি আমার অন্তর্ভুক্ত করা দরকার।
কিম স্ট্যাকস

আপনার ফাংশনটি কেবলমাত্র মূল (মূল) ডিরেক্টরিটি যুক্ত করছে না এবং কিছুই করছে না
কৃষ্ণ টর্কে

আমি জানি এটির উত্তর অনেক আগেই দেওয়া হয়েছিল। মূল নামের পরিবর্তে 'মাইন্ড ডিরেক্টরি' এর জন্য কাস্টম নাম রাখা কি সম্ভব?
বৈভব সিদাপাড়া

@ ভাইভাসিদাপাড়া বিশ্বাস $maindirকরেন পছন্দের নাম পরিবর্তন করে এটি সম্ভব হওয়া উচিত ।
ব্যবহারকারী2019515

দুর্দান্ত উত্তর, আমাকে অনেক সাহায্য করেছে। ব্যতিক্রমগুলি অন্তর্ভুক্ত করার জন্য আমি এই ফাংশনে একটি চতুর্থ যুক্তি যুক্ত করেছি। আমি এই প্রশ্নের অন্য উত্তর হিসাবে চূড়ান্ত কোড যুক্ত করব।
এল। ওয়েললেট

4

ব্যবহার: । Thisfile.php Dir = / পথ / থেকে / ফোল্ডারের (zip করা পর এটা শুরু হয় ডাউনলোড খুব :)

<?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

আমার এই জিপ ফাংশনটি ম্যাক ওএসএক্সে চালানো দরকার

তাই আমি সবসময় এই বিরক্তিকর জিপ করতাম .ডিডিএসএস।

আমি অতিরিক্ত ফাইলগুলি অন্তর্ভুক্ত করে 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();
}

জিপি থেকে। ডিএস_সেটোর উপেক্ষা করার জন্য আপনি চালনা করুন

জিপআইটি ('/ পাথ / টু / ফোল্ডার', '/path/to/compressed.zip', মিথ্যা, অ্যারে ('। ডিএসএসটোোর'));


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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.