PHP: ZIP-Archiv erstellen

Die kleine Hilfsklasse „ZipHelper“ ermöglicht es, auf einfache Weise Zip-Archive mit PHP zu erstellen. Die Dateien und Verzeichnisse lassen sich auf verschiedene Arten über die Methode „addSource“ zu dem Archiv hinzufügen. Verzeichnisse werden rekursiv durchlaufen.

Beispiel:

  $oZipHelper = new ZipHelper("my_archiv.zip");
  $oZipHelper->addSource('*.txt')
             ->addSource('*.php')
             ->addSource('../')
             ->addSource('/test.txt')
             ->addSource(array('/home/sklueh/write.sh',
                               '/home/sklueh/config.php'))
             ->addSource('/home/sklueh/my_directory')
             ->create();


Code:

/**
 * ZipHelper
 *
 * @autor Sebastian Klüh (http://sklueh.de)
 * @license LGPL
 *
 * Example:
 *  $oZipHelper = new ZipHelper("my_archiv.zip");
 *  $oZipHelper->addSource('*.txt')
 *              ->addSource('*.php')
 *              ->addSource('../')
 *              ->addSource('/test.txt')
 *              ->addSource(array('/home/sklueh/write.sh',
 *                                '/home/sklueh/config.php'))
 *              ->addSource('/home/sklueh/my_directory')
 *              ->create();
 */

class ZipHelper
{
    private $sFilename = "archiv.zip";
    private $aSources = array();
    private $oZipArchive = null;
    private $sCurrentParentPath = "";
   
    public function ZIPHelper($sFilename = "")
    {
        $this->oZipArchive = new ZipArchive();
        if($sFilename !== "")
        $this->sFilename = $sFilename;
    }
   
    public function addSource($sSource)
    {
        if(is_array($sSource))
        $this->aSources = array_merge($this->aSources, $sSource);
        else
        $this->aSources[] = $sSource;
        return $this;          
    }
   
    public function create()
    {
        $this->oZipArchive->open($this->sFilename, ZIPARCHIVE::OVERWRITE);
        foreach((array)$this->aSources as $sSource)
        {
            $this->sCurrentParentPath = dirname(realpath($sSource));
            if(is_dir($sSource))
            $this->iterateDir($sSource);
            elseif(is_file($sSource))
            $this->oZipArchive->addFile($sSource, basename($sSource));
            else
            foreach((array)glob($sSource) as $sFoundSource)
            {
                $this->oZipArchive->addFile($sFoundSource, $sFoundSource);
            }
        }
        $this->oZipArchive->close();
    }
   
    private function iterateDir($sPath)
    {
        foreach(new DirectoryIterator($sPath) as $oItem)
        {
            if($oItem->isDir())
            {
                if(!$oItem->isDot())
                $this->iterateDir($oItem->getPathname());              
                continue;
            }
            $this->oZipArchive->addFile($oItem->getPathname(), $this->removeParentDir($oItem->getPathname()));
        }
    }
   
    private function removeParentDir($sPath)
    {
        return str_replace($this->correctPath($this->sCurrentParentPath)."/", "", $this->correctPath(realpath($sPath)));
    }
   
    private function correctPath($sTargetPath)
    {
        return str_replace("//", "/",
               str_replace("\", "/", $sTargetPath));
    }
}

Für Anmerkungen und Verbesserungsvorschläge einfach einen Kommentar unter diesem Artikel hinterlassen – Danke.

GitHub: ZipHelper
Download: master.zip

6 Gedanken zu „PHP: ZIP-Archiv erstellen“

  1. Ich wollte aus der ZIP-Datei ein RAR Archiv machen, daher habe ich

    $oZipHelper = new ZipHelper(„my_archiv.zip“);

    in

    $oZipHelper = new ZipHelper(„my_archiv.rar“);

    umbenannt. Irgendwie scheint es aber nicht zu funktionieren, warum?

  2. Hallo, kannst du sagen, was ich bei addsource eingeben muss, um alle Dateien und Ordner die auf derselben Ebene wie das Script liegen sowie alle, die darunter liegen liegen, komplett zu sichern? Ich würde so gern meinen httpdocs-Ordner sichern, also den gesamten Inhalt. Ich habe es mit addSource(‚*.*‘) und zusätzlich addSource(‚../‘) probiert, bekomme so aber die Unterordner nicht zu fassen.

    Grüße

    1. Hey,
      hast du die Berechtigungen geprüft, unter denen dein Webserver ausgeführt wird? Was passiert, wenn du in deinem übergeordneten Verzeichnis (also eine Ebene über httpdocs) folgendes ausprobierst:

      $oZipHelper = new ZipHelper(„my_archiv.zip“);
      $oZipHelper->addSource(‚httpdocs‘)->create();

      Des Weiteren ist zu beachten, dass nur Verzeichnisse zum Archiv hinzugefügt werden, die nicht leer sind. Ich hoffe ich konnte dir helfen, viele Grüße!

Schreibe einen Kommentar