How to zip a whole folder using PHP

前端 未结 15 2261
有刺的猬
有刺的猬 2020-11-22 08:48

I have found here at stackoveflow some codes on how to ZIP a specific file, but how about a specific folder?

Folder/
  index.html
  picture.jpg
  important.tx         


        
相关标签:
15条回答
  • 2020-11-22 09:14

    This is a function that zips a whole folder and its contents in to a zip file and you can use it simple like this :

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

    function :

    // 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";
    }
    
    0 讨论(0)
  • 2020-11-22 09:14

    Use this function:

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

    Example use:

    zip('/folder/to/compress/', './compressed.zip');
    
    0 讨论(0)
  • 2020-11-22 09:17

    This will resolve your issue. Please try it.

    $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 讨论(0)
  • 2020-11-22 09:20

    This is a working example of making ZIPs in PHP:

    $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();
    
    0 讨论(0)
  • 2020-11-22 09:20

    Use this is working fine.

    $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;
    }
    
    0 讨论(0)
  • 2020-11-22 09:24

    I tried with the code below and it is working. The code is self explanatory, please let me know if you have any questions.

    <?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';
    }
    ?>
    
    0 讨论(0)
提交回复
热议问题