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();
$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));
}
}
* 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
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?
Hi Kenny,
über die Klasse ZipHelper lassen sich leider nur Zip-Archive erstellen.
Gruß
*Facepalm*
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
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!
Hallo,
vielen Dank für die Tipps. Ich habe bei diesem Hosting leider keinen Zugang zum übergeordneten Ordner. Mal sehen, was ich da machen kann.