lib descargar create comprimir clase carpeta php zip

descargar - ziparchive php



Cómo comprimir una carpeta entera usando PHP (14)

He encontrado aquí en stackoveflow algunos códigos sobre cómo ZIP un archivo específico, pero ¿qué tal una carpeta específica?

Folder/ index.html picture.jpg important.txt

dentro de My Folder , hay archivos. después de comprimir My Folder , también quiero eliminar todo el contenido de la carpeta, excepto important.txt .

Encontré esto aquí en la stack

Necesito tu ayuda. Gracias.


¿Por qué no probar EFS PhP-ZiP MultiVolume Script ? He comprimido y transferido cientos de gigs y millones de archivos ... ssh es necesario para crear archivos de manera efectiva.

Pero creo que los archivos resultantes se pueden usar con exec directamente de php:

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

No sé si funciona No lo he probado ...

"el secreto" es que el tiempo de ejecución para el archivo no debe exceder el tiempo permitido para la ejecución del código PHP.


Código actualizado el 22/04/2015.

Zip toda una carpeta:

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

Comprime una carpeta completa + elimina todos los archivos excepto "important.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); }


Encontré esta publicación en google como el segundo resultado superior, primero estaba usando exec :(

De todos modos, aunque esto no satisfacía mis necesidades exactamente ... decidí publicar una respuesta para otros con mi versión rápida pero extendida de esto.

CARACTERÍSTICAS DE SCRIPT

  • Asignación de archivos de respaldo día a día, PREFIX-YYYY-MM-DD-POSTFIX.EXTENSION
  • Archivo de informes / falta
  • Listado de copias de seguridad anteriores
  • No comprime / incluye copias de seguridad anteriores;)
  • Funciona en Windows / Linux

De todos modos, en el guión ... Aunque puede parecer mucho ... Recuerde que hay un exceso aquí ... Así que siéntase libre de eliminar las secciones de informes según sea necesario ...

También puede parecer desordenado y ciertas cosas se pueden limpiar fácilmente ... Así que no comenten sobre eso, es solo un guión rápido con comentarios básicos incluidos ... NO PARA USO EN VIVO .. Pero fácil de limpiar para uso en vivo !

En este ejemplo, se ejecuta desde un directorio que está dentro de la carpeta raíz www / public_html. Por lo tanto, solo tiene que subir una carpeta para llegar a la raíz.

<?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]; } ?>

¿¿QUÉ HACE??

Simplemente comprimirá los contenidos completos de la variable $ pathBase y almacenará el archivo zip en esa misma carpeta. Hace una detección simple para copias de seguridad previas y las omite.

CRON BACKUP

Esta secuencia de comandos que acabo de probar en Linux y funcionó bien desde un trabajo cron con el uso de una URL absoluta para el pathBase.


Esta es una función que comprime una carpeta completa y su contenido en un archivo zip y puede usarlo de manera simple así:

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

función:

// 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"; }


Este es un ejemplo de trabajo de crear archivos ZIP en 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();


Esto resolverá tu problema. Por favor pruebalo.

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


Hay un método indocumentado útil en la clase ZipArchive: addGlob ();

$zipFile = "./testZip.zip"; $zipArchive = new ZipArchive(); if (!$zipArchive->open($zipFile, ZIPARCHIVE::OVERWRITE)) 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();

Ahora documentado en: www.php.net/manual/en/ziparchive.addglob.php


Hice algunas pequeñas mejoras en el guión.

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


Intenté con el siguiente código y está funcionando. El código es explicativo, por favor avíseme si tiene alguna pregunta.

<?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''; } ?>


Para cualquiera que lea esta publicación y busque un por qué comprimir los archivos usando addFile en lugar de addFromString, eso no comprime los archivos con su ruta absoluta (solo comprime los archivos y nada más), consulte mi pregunta y respuesta here


Prueba esto:

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

Sin embargo, esto no se comprimirá recursivamente.


Supongo que esto se está ejecutando en un servidor donde la aplicación zip está en la ruta de búsqueda. Debería ser cierto para todos los servidores basados ​​en Unix y creo que la mayoría de los basados ​​en Windows.

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

El archivo residirá en archive.zip después. Tenga en cuenta que los espacios en blanco en los nombres de archivo o carpeta son una causa común de errores y deben evitarse siempre que sea posible.


Usa esta función:

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

Ejemplo de uso:

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


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