PHP का उपयोग करके पूरे फ़ोल्डर को ज़िप कैसे करें


131

मैंने यहां स्टैकविस्टफ़्लो में कुछ कोड्स पर पाया है कि किसी विशिष्ट फ़ाइल को कैसे जिप करना है, लेकिन एक विशिष्ट फ़ोल्डर के बारे में कैसे?

Folder/
  index.html
  picture.jpg
  important.txt

अंदर My Folder, वहाँ फ़ाइलें हैं। ज़िप करने के बाद My Folder, मैं फ़ोल्डर को छोड़कर पूरी सामग्री को हटाना चाहता हूं important.txt

यह यहां स्टैक पर मिला

मुझे आपकी मदद चाहिए। धन्यवाद।


जहां तक ​​मैं देख सकता हूं, आपने जो स्टैकओवरफ्लो लिंक प्रदान किया है वह वास्तव में कई फाइलों को ज़िप करता है। आपको किस हिस्से से परेशानी है?
लास एस्पेहोल्ट

@lasseespeholt लिंक मैंने आपको केवल एक विशिष्ट फ़ाइल के लिए दिया है, न कि फ़ोल्डर और फ़ोल्डर की सामग्री को ..
wininana

वह फाइलों की एक सरणी लेता है (अनिवार्य रूप से एक फ़ोल्डर) और सभी फाइलों को जिप फाइल (लूप) में जोड़ता है। मैं देख सकता हूं कि एक अच्छा उत्तर अब +1 :) पोस्ट किया गया है, जो एक ही कोड है, सरणी अभी एक निर्देशिका से फाइलों की एक सूची है।
लास एस्पेहोल्ट


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

जवाबों:


320

कोड 2015/04/22 अपडेट किया गया।

एक संपूर्ण फ़ोल्डर ज़िप करें:

// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);
    }
}

// Zip archive will be created only after closing object
$zip->close();

एक संपूर्ण फ़ोल्डर को ज़िप करें "महत्वपूर्ण। Txt" को छोड़कर सभी फ़ाइलों को हटा दें:

// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Initialize empty "delete list"
$filesToDelete = array();

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);

        // Add current file to "delete list"
        // delete it later cause ZipArchive create archive only after calling close function and ZipArchive lock files until archive created)
        if ($file->getFilename() != 'important.txt')
        {
            $filesToDelete[] = $filePath;
        }
    }
}

// Zip archive will be created only after closing object
$zip->close();

// Delete all files from "delete list"
foreach ($filesToDelete as $file)
{
    unlink($file);
}

2
आपको 777 पर dir (जहाँ यह स्क्रिप्ट स्थित है) पर chmod (लेखन योग्य) सेट करना होगा। उदाहरण के लिए: यदि स्क्रिप्ट /var/www/localhost/script.php में स्थित है, तो आपको dm / var / www / localhost पर chmod 0777 सेट करने की आवश्यकता है /।
DDA

3
कॉल करने से पहले फ़ाइलों को हटाने से $zip->close()काम नहीं चलेगा। यहाँ
hek2mgl

10
@alnassre को इस प्रश्न की आवश्यकता है: "मैं भी महत्वपूर्ण.txt को छोड़कर फ़ोल्डर की पूरी सामग्री को हटाना चाहता हूं"। इसके अलावा मैं आपको सलाह देता हूं कि इसे निष्पादित करने से पहले हमेशा कोड पढ़ें।
डोरडर

1
@alnassre hahahaha ... क्षमा करें :) ... hahaha
Ondrej Rafaj

1
@ निक-न्यूमैन, हाँ, प्रतिशत की गणना करने के लिए आप लूप के अंदर php.net/manual/ru/function.iterator-count.php + काउंटर का उपयोग कर सकते हैं । सम्पीडन स्तर के बारे में - इस समय ZipArchive के साथ संभव नहीं है: stackoverflow.com/questions/1833168/…
DDA

54

ZipArchive वर्ग में एक उपयोगी अविवादित विधि है: addGlob ();

$zipFile = "./testZip.zip";
$zipArchive = new ZipArchive();

if ($zipArchive->open($zipFile, (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== true)
    die("Failed to create archive\n");

$zipArchive->addGlob("./*.txt");
if ($zipArchive->status != ZIPARCHIVE::ER_OK)
    echo "Failed to write files to zip\n";

$zipArchive->close();

अब इस पर प्रलेखित: www.php.net/manual/en/ziparchive.addglob.php


2
@netcoder - इसके परीक्षण के लिए phpt लिखा होने के लाभ ... मूल रूप से, ZipArchive वर्ग के लिए स्रोत के माध्यम से पढ़ा, और इसे वहाँ पाया .... वहाँ भी एक undocumented addPattern () विधि है जो एक रेगीक्स शैली पैटर्न लेता है, लेकिन मैं उस काम को करने में कभी कामयाब नहीं हुआ (क्लास में बग हो सकता है)
मार्क बेकर

1
@kread - आप इसे किसी भी फ़ाइल सूची के साथ उपयोग कर सकते हैं जिसे ग्लोब () का उपयोग करके निकाला जा सकता है, इसलिए मैंने इसे खोजने के बाद से इसे बहुत उपयोगी पाया है।
मार्क बेकर

@MarkBaker मुझे पता है कि यह टिप्पणी आपके द्वारा पोस्ट किए जाने के वर्षों के बाद से आ रही है, मैं यहाँ अपनी किस्मत आज़मा रहा हूँ। मैंने यहां एक सवाल पोस्ट किया है, साथ ही ज़िपिंग के बारे में। मैं आपके द्वारा यहां पोस्ट की गई ग्लोब विधि को आजमाने जा रहा हूं, लेकिन मेरा मुख्य मुद्दा यह है कि मैं addFromString का उपयोग नहीं कर सकता हूं, और addFile का उपयोग कर रहा हूं, जो अभी चुपचाप विफल हो रहा है। क्या आपको शायद पता है कि क्या गलत हो सकता है, या मैं क्या गलत कर सकता हूं?
स्काईटाइगर

@ user1032531 - मेरी पोस्ट की अंतिम पंक्ति (13 दिसंबर 2013 को संपादित), केवल डॉक्स पृष्ठ के लिंक के साथ
मार्क बेकर

6
है addGlobपुनरावर्ती?
विंसेंट पियरिएर

20

इसे इस्तेमाल करे:

$zip = new ZipArchive;
$zip->open('myzip.zip', ZipArchive::CREATE);
foreach (glob("target_folder/*") as $file) {
    $zip->addFile($file);
    if ($file != 'target_folder/important.txt') unlink($file);
}
$zip->close();

हालांकि यह पुनरावृत्ति नहीं होगा


यह निश्चित रूप से कुछ फ़ाइलों को हटाता है My folder, लेकिन मेरे पास एक फ़ोल्डर के भीतर एक फ़ोल्डर भी है My folderजो मुझे एक त्रुटि देता है: फ़ोल्डर को अनलिंक करने से इनकार करने की अनुमति दी गईMy folder
wininana

@Stupefy: if (!is_dir($file) && $file != 'target_folder...')इसके बजाय प्रयास करें । या यदि आप पुनरावर्ती रूप से ज़िप करना चाहते हैं तो @kread उत्तर की जांच करें , यह सबसे कारगर तरीका है।
netcoder

के भीतर का फोल्डर My folderअभी भी डिलीट नहीं हुआ है, लेकिन वैसे भी ज्यादा एरर नहीं हैं।
विनिनाना

मैं यह भी उल्लेख करना भूल गया कि मैं कोई .zip फाइलें नहीं बनाई हैं।
विनीना

1
कॉल करने से पहले फ़ाइलों को हटाने से $zip->close()काम नहीं चलेगा। यहाँ
hek2mgl

19

मुझे लगता है कि यह एक सर्वर पर चल रहा है जहां ज़िप एप्लिकेशन खोज पथ में है। सभी यूनिक्स-आधारित के लिए सच होना चाहिए और मुझे लगता है कि अधिकांश विंडोज़-आधारित सर्वर हैं।

exec('zip -r archive.zip "My folder"');
unlink('My\ folder/index.html');
unlink('My\ folder/picture.jpg');

संग्रह में संग्रहित होगा। बाद में संग्रहीत करें। ध्यान रखें कि फ़ाइल या फ़ोल्डर नामों में रिक्तियां त्रुटियों का एक सामान्य कारण हैं और जहां संभव हो, वहां से बचना चाहिए।


15

मैंने नीचे दिए गए कोड के साथ कोशिश की और यह काम कर रहा है। कोड स्व व्याख्यात्मक है, कृपया मुझे बताएं कि क्या आपके कोई प्रश्न हैं।

<?php
class FlxZipArchive extends ZipArchive 
{
 public function addDir($location, $name) 
 {
       $this->addEmptyDir($name);
       $this->addDirDo($location, $name);
 } 
 private function addDirDo($location, $name) 
 {
    $name .= '/';
    $location .= '/';
    $dir = opendir ($location);
    while ($file = readdir($dir))
    {
        if ($file == '.' || $file == '..') continue;
        $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
        $this->$do($location . $file, $name . $file);
    }
 } 
}
?>

<?php
$the_folder = '/path/to/folder/to/be/zipped';
$zip_file_name = '/path/to/zip/archive.zip';
$za = new FlxZipArchive;
$res = $za->open($zip_file_name, ZipArchive::CREATE);
if($res === TRUE) 
{
    $za->addDir($the_folder, basename($the_folder));
    $za->close();
}
else{
echo 'Could not create a zip archive';
}
?>

उत्कृष्ट समाधान। यह लार्वा 5.5 में भी काम करता है। वास्तव में पसंद आया। (y)
वेब कारीगर

1
महान कोड! स्वच्छ, सरल और पूरी तरह से काम! ;) यह मेरे लिए सबसे अच्छा जवाब लगता है। अगर यह किसी की मदद कर सकता है: मैं सिर्फ ini_set('memory_limit', '512M');स्क्रिप्ट के निष्पादन से पहले और ini_restore('memory_limit');अंत में जोड़ा गया । भारी फ़ोल्डरों के मामले में स्मृति की कमी से बचने के लिए यह आवश्यक था (यह 500 एमबी से बड़ा एक फ़ोल्डर था)।
जैकोपो पेस

1
मेरे वातावरण में (PHP 7.3, डेबियन) एक निर्देशिका सूची के बिना एक ज़िप संग्रह बनाया गया था (बड़ा, खाली फ़ाइल)। मुझे निम्नलिखित पंक्ति बदलनी थी: $ नाम। = '/'; $ नाम में = ($ नाम == ''? '': $ नाम। '/');
गेरफ्रीड

यह मेरे लिए काम कर रहा है। साझा करने के लिए धन्यवाद। चीयर्स!
11

8

यह एक ऐसा फंक्शन है जो एक पूरे फोल्डर और उसके कंटेंट को जिप फाइल में जिप करता है और आप इसे इस तरह सिंपल यूज कर सकते हैं:

addzip ("path/folder/" , "/path2/folder.zip" );

समारोह :

// compress all files in the source directory to destination directory 
    function create_zip($files = array(), $dest = '', $overwrite = false) {
    if (file_exists($dest) && !$overwrite) {
        return false;
    }
    if (($files)) {
        $zip = new ZipArchive();
        if ($zip->open($dest, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        foreach ($files as $file) {
            $zip->addFile($file, $file);
        }
        $zip->close();
        return file_exists($dest);
    } else {
        return false;
    }
}

function addzip($source, $destination) {
    $files_to_zip = glob($source . '/*');
    create_zip($files_to_zip, $destination);
    echo "done";
}

इस स्क्रिप्ट के साथ स्वचालित रूप से बैकअप में उप-फ़ोल्डर्स को भी कैसे शामिल किया जाए? @ एलेरिज़ा
फ्लोकार्ड

2

EFS PhP-ZiP MultiVolume Script क्यों न आज़माएं ... मैंने ज़िप किया और सैकड़ों गिग्स और लाखों फाइलें हस्तांतरित की ... अभिलेखागार को प्रभावी ढंग से बनाने के लिए ssh की जरूरत है।

लेकिन मुझे लगता है कि परिणामस्वरूप फ़ाइलों को सीधे php से निष्पादन के साथ इस्तेमाल किया जा सकता है:

exec('zip -r backup-2013-03-30_0 . -i@backup-2013-03-30_0.txt');

मुझे नहीं पता कि यह काम करता है या नहीं। मैंने कोशिश नहीं की ...

"रहस्य" यह है कि संग्रह के लिए निष्पादन समय PHP कोड के निष्पादन के लिए अनुमत समय से अधिक नहीं होना चाहिए।


1

यह PHP में ZIP बनाने का एक कार्यशील उदाहरण है:

$zip = new ZipArchive();
$zip_name = time().".zip"; // Zip name
$zip->open($zip_name,  ZipArchive::CREATE);
foreach ($files as $file) {
  echo $path = "uploadpdf/".$file;
  if(file_exists($path)){
  $zip->addFromString(basename($path),  file_get_contents($path));---This is main function  
  }
  else{
   echo"file does not exist";
  }
}
$zip->close();

1

मैंने इस पोस्ट को दूसरे शीर्ष परिणाम के रूप में Google में पाया, पहले निष्पादन का उपयोग कर रहा था :(

वैसे भी, जबकि यह मेरी आवश्यकताओं के अनुरूप नहीं था .. मैंने अपने त्वरित लेकिन विस्तारित संस्करण के साथ दूसरों के लिए उत्तर पोस्ट करने का निर्णय लिया।

SCRIPT फीचर्स

  • बैकअप फ़ाइल नामकरण दिन-प्रतिदिन, PREFIX-YYYY-MM-DD-POSTFIX.EXTENSION
  • फ़ाइल रिपोर्टिंग / गुम
  • पिछला बैकअप लिस्टिंग
  • पिछले बैकअप को ज़िप / शामिल नहीं करता;)
  • खिड़कियों / लाइन पर काम करता है

वैसे भी, स्क्रिप्ट पर .. जबकि यह बहुत कुछ लग सकता है .. याद रखें कि यहाँ अतिरिक्त है .. इसलिए आवश्यकतानुसार रिपोर्टिंग अनुभागों को हटाने के लिए स्वतंत्र महसूस करें ...

इसके अलावा यह गन्दा लग सकता है और कुछ चीजों को आसानी से साफ किया जा सकता है ... तो इसके बारे में टिप्पणी न करें, इसकी मूल स्क्रिप्ट के साथ एक त्वरित स्क्रिप्ट है .. न कि LIVE USE के लिए .. लेकिन लाइव उपयोग के लिए साफ करना आसान है !

इस उदाहरण में, इसे एक निर्देशिका से चलाया जाता है जो रूट www / public_html फ़ोल्डर के अंदर है .. इसलिए केवल रूट पर जाने के लिए एक फ़ोल्डर की यात्रा करने की आवश्यकता है।

<?php
    // DIRECTORY WE WANT TO BACKUP
    $pathBase = '../';  // Relate Path

    // ZIP FILE NAMING ... This currently is equal to = sitename_www_YYYY_MM_DD_backup.zip 
    $zipPREFIX = "sitename_www";
    $zipDATING = '_' . date('Y_m_d') . '_';
    $zipPOSTFIX = "backup";
    $zipEXTENSION = ".zip";

    // SHOW PHP ERRORS... REMOVE/CHANGE FOR LIVE USE
    ini_set('display_errors',1);
    ini_set('display_startup_errors',1);
    error_reporting(-1);




// ############################################################################################################################
//                                  NO CHANGES NEEDED FROM THIS POINT
// ############################################################################################################################

    // SOME BASE VARIABLES WE MIGHT NEED
    $iBaseLen = strlen($pathBase);
    $iPreLen = strlen($zipPREFIX);
    $iPostLen = strlen($zipPOSTFIX);
    $sFileZip = $pathBase . $zipPREFIX . $zipDATING . $zipPOSTFIX . $zipEXTENSION;
    $oFiles = array();
    $oFiles_Error = array();
    $oFiles_Previous = array();

    // SIMPLE HEADER ;)
    echo '<center><h2>PHP Example: ZipArchive - Mayhem</h2></center>';

    // CHECK IF BACKUP ALREADY DONE
    if (file_exists($sFileZip)) {
        // IF BACKUP EXISTS... SHOW MESSAGE AND THATS IT
        echo "<h3 style='margin-bottom:0px;'>Backup Already Exists</h3><div style='width:800px; border:1px solid #000;'>";
            echo '<b>File Name: </b>',$sFileZip,'<br />';
            echo '<b>File Size: </b>',$sFileZip,'<br />';
        echo "</div>";
        exit; // No point loading our function below ;)
    } else {

        // NO BACKUP FOR TODAY.. SO START IT AND SHOW SCRIPT SETTINGS
        echo "<h3 style='margin-bottom:0px;'>Script Settings</h3><div style='width:800px; border:1px solid #000;'>";
            echo '<b>Backup Directory: </b>',$pathBase,'<br /> ';
            echo '<b>Backup Save File: </b>',$sFileZip,'<br />';
        echo "</div>";

        // CREATE ZIPPER AND LOOP DIRECTORY FOR SUB STUFF
        $oZip = new ZipArchive;
        $oZip->open($sFileZip,  ZipArchive::CREATE | ZipArchive::OVERWRITE);
        $oFilesWrk = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathBase),RecursiveIteratorIterator::LEAVES_ONLY);
        foreach ($oFilesWrk as $oKey => $eFileWrk) {
            // VARIOUS NAMING FORMATS OF THE CURRENT FILE / DIRECTORY.. RELATE & ABSOLUTE
            $sFilePath = substr($eFileWrk->getPathname(),$iBaseLen, strlen($eFileWrk->getPathname())- $iBaseLen);
            $sFileReal = $eFileWrk->getRealPath();
            $sFile = $eFileWrk->getBasename();

            // WINDOWS CORRECT SLASHES
            $sMyFP = str_replace('\\', '/', $sFileReal);

            if (file_exists($sMyFP)) {  // CHECK IF THE FILE WE ARE LOOPING EXISTS
                if ($sFile!="."  && $sFile!="..") { // MAKE SURE NOT DIRECTORY / . || ..
                    // CHECK IF FILE HAS BACKUP NAME PREFIX/POSTFIX... If So, Dont Add It,, List It
                    if (substr($sFile,0, $iPreLen)!=$zipPREFIX && substr($sFile,-1, $iPostLen + 4)!= $zipPOSTFIX.$zipEXTENSION) {
                        $oFiles[] = $sMyFP;                     // LIST FILE AS DONE
                        $oZip->addFile($sMyFP, $sFilePath);     // APPEND TO THE ZIP FILE
                    } else {
                        $oFiles_Previous[] = $sMyFP;            // LIST PREVIOUS BACKUP
                    }
                }
            } else {
                $oFiles_Error[] = $sMyFP;                       // LIST FILE THAT DOES NOT EXIST
            }
        }
        $sZipStatus = $oZip->getStatusString();                 // GET ZIP STATUS
        $oZip->close(); // WARNING: Close Required to append files, dont delete any files before this.

        // SHOW BACKUP STATUS / FILE INFO
        echo "<h3 style='margin-bottom:0px;'>Backup Stats</h3><div style='width:800px; height:120px; border:1px solid #000;'>";
            echo "<b>Zipper Status: </b>" . $sZipStatus . "<br />";
            echo "<b>Finished Zip Script: </b>",$sFileZip,"<br />";
            echo "<b>Zip Size: </b>",human_filesize($sFileZip),"<br />";
        echo "</div>";


        // SHOW ANY PREVIOUS BACKUP FILES
        echo "<h3 style='margin-bottom:0px;'>Previous Backups Count(" . count($oFiles_Previous) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
        foreach ($oFiles_Previous as $eFile) {
            echo basename($eFile) . ", Size: " . human_filesize($eFile) . "<br />";
        }
        echo "</div>";

        // SHOW ANY FILES THAT DID NOT EXIST??
        if (count($oFiles_Error)>0) {
            echo "<h3 style='margin-bottom:0px;'>Error Files, Count(" . count($oFiles_Error) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
            foreach ($oFiles_Error as $eFile) {
                echo $eFile . "<br />";
            }
            echo "</div>";
        }

        // SHOW ANY FILES THAT HAVE BEEN ADDED TO THE ZIP
        echo "<h3 style='margin-bottom:0px;'>Added Files, Count(" . count($oFiles) . ")</h3><div style='overflow:auto; width:800px; height:120px; border:1px solid #000;'>";
        foreach ($oFiles as $eFile) {
            echo $eFile . "<br />";
        }
        echo "</div>";

    }


    // CONVERT FILENAME INTO A FILESIZE AS Bytes/Kilobytes/Megabytes,Giga,Tera,Peta
    function human_filesize($sFile, $decimals = 2) {
        $bytes = filesize($sFile);
        $sz = 'BKMGTP';
        $factor = floor((strlen($bytes) - 1) / 3);
        return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
    }
?>

यह क्या करता है??

यह बस चर $ pathBase की पूरी सामग्री को ज़िप करेगा और ज़िप को उसी फ़ोल्डर में संग्रहीत करेगा। यह पिछले बैकअप के लिए एक सरल पता लगाने और उन्हें छोड़ देता है।

क्रोन बैकप

यह स्क्रिप्ट मैंने सिर्फ linux पर परीक्षण की है और pathBase के लिए एक पूर्ण यूआरएल का उपयोग करने के साथ एक क्रॉन नौकरी से ठीक काम किया है।


मैंने डिलीट स्क्रिप्ट को भी बाहर कर दिया है, आप इसके लिए स्वीकृत उत्तर देख सकते हैं
एंग्री 84

समझाना होगा कि क्यों टिप्पणी के बिना उन यादृच्छिक वोट नीचे प्यार करता हूँ।
गुस्सा 84

1

इस फ़ंक्शन का उपयोग करें:

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 . '/'));
            } 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();
}

उदाहरण का उपयोग करें:

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

1

यह प्रयोग ठीक काम कर रहा है।

$dir = '/Folder/';
$zip = new ZipArchive();
$res = $zip->open(trim($dir, "/") . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ($res === TRUE) {
    foreach (glob($dir . '*') as $file) {
        $zip->addFile($file, basename($file));
    }
    $zip->close();
} else {
    echo 'Failed to create to zip. Error: ' . $res;
}

1

PHP में एक ज़िप फ़ोल्डर बनाएँ।

ज़िप बनाने की विधि

   public function zip_creation($source, $destination){
    $dir = opendir($source);
    $result = ($dir === false ? false : true);

    if ($result !== false) {

        
        $rootPath = realpath($source);
         
        // Initialize archive object
        $zip = new ZipArchive();
        $zipfilename = $destination.".zip";
        $zip->open($zipfilename, ZipArchive::CREATE | ZipArchive::OVERWRITE );
         
        // Create recursive directory iterator
        /** @var SplFileInfo[] $files */
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY);
         
        foreach ($files as $name => $file)
        {
            // Skip directories (they would be added automatically)
            if (!$file->isDir())
            {
                // Get real and relative path for current file
                $filePath = $file->getRealPath();
                $relativePath = substr($filePath, strlen($rootPath) + 1);
         
                // Add current file to archive
                $zip->addFile($filePath, $relativePath);
            }
        }
         
        // Zip archive will be created only after closing object
        $zip->close();
        
        return TRUE;
    } else {
        return FALSE;
    }


}

जिप विधि को बुलाओ

$source = $source_directory;
$destination = $destination_directory;
$zipcreation = $this->zip_creation($source, $destination);

0

मैंने स्क्रिप्ट में कुछ छोटे सुधार किए।

  <?php
    $directory = "./";
    //create zip object
    $zip = new ZipArchive();
    $zip_name = time().".zip";
    $zip->open($zip_name,  ZipArchive::CREATE);
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($directory),
        RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $file) {
        $path = $file->getRealPath();
        //check file permission
        if(fileperms($path)!="16895"){
            $zip->addFromString(basename($path),  file_get_contents($path)) ;
            echo "<span style='color:green;'>{$path} is added to zip file.<br /></span> " ;
        }
        else{
            echo"<span style='color:red;'>{$path} location could not be added to zip<br /></span>";
        }
    }
    $zip->close();
    ?>

यह फाइलों को ज़िप कर देता है, लेकिन डायरेक्टरी लिस्टिंग चली गई है, इसकी खुराक अब डायरेक्टरी नहीं है
Sujay sreedhar

0

इससे आपकी समस्या दूर हो जाएगी। कृपया इसे आजमाएँ।

$zip = new ZipArchive;
$zip->open('testPDFZip.zip', ZipArchive::CREATE);
foreach (glob(APPLICATION_PATH."pages/recruitment/uploads/test_pdf_folder/*") as $file) {
    $new_filename = end(explode("/",$file));
    $zip->addFile($file,"emp/".$new_filename);
}           
$zip->close();

0

किसी को भी इस पोस्ट को पढ़ने के लिए और addFromString के बजाय addFile का उपयोग करके फ़ाइलों को ज़िप करने के लिए एक क्यों की तलाश है, जो अपने पूर्ण पथ के साथ फ़ाइलों को ज़िप नहीं करता है (बस फ़ाइलों को ज़िप करता है और कुछ नहीं), मेरा प्रश्न और उत्तर यहां देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.