wake-up-neo.net

So komprimieren Sie einen ganzen Ordner mit PHP

Ich habe hier bei stackoveflow einige Codes gefunden, wie man eine bestimmte Datei komprimiert, aber wie sieht es mit einem bestimmten Ordner aus?

Folder/
  index.html
  picture.jpg
  important.txt

in My Folder befinden sich Dateien. Nach dem Zippen von My Folder möchte ich auch den gesamten Inhalt des Ordners mit Ausnahme von important.txt löschen.

Fand das hier bei stack

Ich brauche deine Hilfe. Vielen Dank.

106
woninana

Code aktualisiert 2015/04/22.

Einen ganzen Ordner komprimieren:

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

Einen ganzen Ordner komprimieren und alle Dateien außer "important.txt" löschen

// 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);
}
262
Dador

In der ZipArchive-Klasse gibt es eine nützliche undokumentierte Methode: 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();

Jetzt dokumentiert unter: www.php.net/manual/de/ziparchive.addglob.php

47
Mark Baker

Versuche dies:

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

Dies wird jedoch nicht rekursiv.

19
netcoder

Ich gehe davon aus, dass dies auf einem Server läuft, auf dem sich die Zip-Anwendung im Suchpfad befindet. Sollte für alle Unix-basierten und die meisten Windows-basierten Server zutreffen.

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

Das Archiv befindet sich anschließend in archive.Zip. Beachten Sie, dass Leerzeichen in Datei- oder Ordnernamen eine häufige Fehlerursache sind und nach Möglichkeit vermieden werden sollten. 

16
Kevin Read

Ich habe es mit dem Code versucht und es funktioniert. Der Code ist selbsterklärend, bitte lassen Sie mich wissen, wenn Sie Fragen haben.

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

Dies ist eine Funktion, die einen ganzen Ordner und dessen Inhalt in eine ZIP-Datei packt. Sie können es einfach wie folgt verwenden:

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

funktion: 

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

Dies ist ein funktionierendes Beispiel für das Erstellen von 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();
1
Sun Love

Verwenden Sie diese Funktion:

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

Anwendungsbeispiel:

Zip('/folder/to/compress/', './compressed.Zip');
1
Waqar Alamgir

Verwenden Sie dies funktioniert gut.

$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
Indrajeet Singh

Warum nicht versuchen? EFS PhP-Zip MultiVolume Script ... Ich habe hunderte von Gigs und Millionen von Dateien gezippt und übertragen ... ssh wird benötigt, um Archive effektiv zu erstellen.

Ich glaube jedoch, dass die resultierenden Dateien mit exec direkt aus php verwendet werden können:

exec('Zip -r backup-2013-03-30_0 . [email protected]_0.txt');

Ich weiß nicht, ob es funktioniert. Ich habe es nicht versucht ...

"Das Geheimnis" ist, dass die Ausführungszeit für die Archivierung die für die Ausführung von PHP Code zulässige Zeit nicht überschreiten darf.

1
ByREV

Wenn Sie diesen Beitrag lesen und wissen möchten, warum Sie die Dateien mithilfe von addFile anstelle von addFromString komprimieren sollen, werden die Dateien nicht mit ihrem absoluten Pfad komprimiert (nur die Dateien komprimiert und sonst nichts), lesen Sie meine Frage und Antwort hier)

0
Skytiger

Ich habe das Skript etwas verbessert.

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

Dies wird Ihr Problem beheben. Versuch es bitte.

$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
Lakhan

Ich fand diesen Beitrag in Google als zweites Top-Ergebnis. Zuerst wurde mit exec gearbeitet :( 

Wie auch immer, während dies meinen Bedürfnissen nicht genau entsprach. Ich entschied mich, eine Antwort für andere mit meiner schnellen, aber erweiterten Version zu veröffentlichen.

SCRIPT-EIGENSCHAFTEN

  • Backup-Dateiname Tag für Tag, PREFIX-JJJJ-MM-DD-POSTFIX.EXTENSION
  • Dateiberichterstattung/fehlt
  • Liste der vorherigen Sicherungen
  • Vorherige Sicherungen nicht komprimieren;)
  • Funktioniert unter Windows/Linux

Wie auch immer, auf das Skript .. Während es wie eine Menge aussieht .. Denken Sie daran, dass hier viel zu viel ist. Sie können also die Berichtsabschnitte nach Bedarf löschen ... 

Es kann auch unordentlich aussehen und bestimmte Dinge könnten leicht aufgeräumt werden ... Also kommentieren Sie es nicht, es ist nur ein schnelles Skript mit grundlegenden Kommentaren. NICHT FÜR DEN LIVE-GEBRAUCH !

In diesem Beispiel wird es von einem Verzeichnis ausgeführt, das sich im Stammverzeichnis des Ordners www/public_html befindet. Es muss also nur ein Ordner nach oben verschoben werden, um zum Stammverzeichnis zu gelangen.

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

WAS TUT ES??

Es wird einfach den gesamten Inhalt der Variablen $ pathBase in eine ZIP-Datei gepackt und die ZIP-Datei in demselben Ordner gespeichert. Vorherige Sicherungen werden einfach erkannt und übersprungen.

CRON BACKUP

Dieses Skript habe ich gerade unter Linux getestet und von einem Cron-Job aus mit einer absoluten URL für die pathBase gearbeitet.

0
Mayhem