Rotate a directory in Zip using PHP

How do I turn a directory into a zip file with PHP?

Thanks.

+4
source share
3 answers

From " Pin directory to PHP .


Here is a simple function that can compress any file or directory recursively, only the zip extension is required for download.

function Zip($source, $destination) { if (extension_loaded('zip') === true) { if (file_exists($source) === true) { $zip = new ZipArchive(); if ($zip->open($destination, ZIPARCHIVE::CREATE) === true) { $source = realpath($source); if (is_dir($source) === true) { $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file) { $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(); } } return false; } 

Name it as follows:

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

EDIT. This item will not preserve the folder structure (check my comment):

 function Zip($source, $destination) { if (extension_loaded('zip') === true) { if (file_exists($source) === true) { $zip = new ZipArchive(); if ($zip->open($destination, ZIPARCHIVE::CREATE) === true) { if (is_dir($source) === true) { $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file) { if (is_file($file) === true) { $zip->addFromString(basename($file), file_get_contents($file)); } } } else if (is_file($source) === true) { $zip->addFromString(basename($source), file_get_contents($source)); } } return $zip->close(); } } return false; } 
+11
source

It seems shorter shorter.

 <?php $sourcePath = realpath('../../'); $archiv = new ZipArchive(); $archiv->open('archiv.zip', ZipArchive::CREATE); $dirIter = new RecursiveDirectoryIterator($sourcePath); $iter = new RecursiveIteratorIterator($dirIter); foreach($iter as $element) { /* @var $element SplFileInfo */ $dir = str_replace($sourcePath, '', $element->getPath()) . '/'; if ($element->isDir()) { $archiv->addEmptyDir($dir); } elseif ($element->isFile()) { $file = $element->getPath() . '/' . $element->getFilename(); $fileInArchiv = $dir . $element->getFilename(); // add file to archive $archiv->addFile($file, $fileInArchiv); } } // Save a comment $archiv->setArchiveComment('Backup ' . $absolutePath); // save and close $archiv->close(); // to extract $destinationPath = realpath('tmp/'); $archiv = new ZipArchive(); $archiv->open('archiv.zip'); $archiv->extractTo($destinationPath); 
0
source

For Windows servers, you need to change it or get the entire directory hierarchy with C:

  foreach ($files as $file) { $currentfile = substr($file, strpos($file, "\\") + 1); $file = str_replace('\\', '/', $file); if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) ) continue; $file = realpath($file); if (is_dir($file) === true) { $dirloc = $currentfile; $zip->addEmptyDir($dirloc); } elseif(is_file($file) === true) { $fileloc = $currentfile; $zip->addFromString($fileloc,file_get_contents($file)); } } 
0
source

Source: https://habr.com/ru/post/1299160/


All Articles