So komprimieren Sie einen ganzen Ordner mit PHP

131

Ich habe hier bei stackoveflow einige Codes zum ZIP einer bestimmten Datei gefunden, aber wie wäre es mit einem bestimmten Ordner?

Folder/
  index.html
  picture.jpg
  important.txt

drinnen drin My Foldersind Dateien. Nach dem Zippen der My Foldermöchte ich auch den gesamten Inhalt des Ordners löschen, außer important.txt.

Fand dies hier bei Stack

Ich brauche deine Hilfe. Vielen Dank.

Woninana
quelle
Soweit ich sehen kann, komprimiert der von Ihnen bereitgestellte Stackoverflow-Link tatsächlich mehrere Dateien. Mit welchem ​​Teil hast du Probleme?
Lasse Espeholt
@lasseespeholt Der Link, den ich Ihnen gegeben habe, komprimiert nur eine bestimmte Datei, nicht den Ordner und den Inhalt des Ordners ..
woninana
Er nimmt eine Reihe von Dateien (im Wesentlichen einen Ordner) und fügt alle Dateien der Zip-Datei (der Schleife) hinzu. Ich kann sehen, dass eine gute Antwort jetzt gepostet wurde +1 :) Das ist der gleiche Code, das Array ist nur eine Liste von Dateien aus einem Verzeichnis.
Lasse Espeholt
Mögliches Duplikat des Komprimierungs- / Archivordners mit PHP-Skript
Pekka

Antworten:

320

Code aktualisiert am 22.04.2015.

Zip einen ganzen Ordner:

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

Zippen Sie einen ganzen Ordner + löschen Sie alle Dateien außer "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);
}
Dador
quelle
2
Sie müssen chmod (beschreibbar) in dir (wo sich dieses Skript befindet) auf 777 setzen. Beispiel: Wenn sich das Skript in /var/www/localhost/script.php befindet, müssen Sie chmod 0777 in dir / var / www / localhost setzen /.
Dador
3
Das Löschen der Dateien vor dem Aufruf $zip->close()funktioniert nicht. Überprüfen Sie meine Antwort hier
hek2mgl
10
@alnassre das ist Voraussetzung für die Frage: "Ich möchte auch den gesamten Inhalt des Ordners mit Ausnahme von important.txt löschen". Außerdem rate ich Ihnen, den Code immer zu lesen, bevor Sie ihn ausführen.
Dador
1
@ Alnassre hahahaha ... sorry :) ... hahaha
Ondrej Rafaj
1
@ nick-newman, ja, um Prozent zu berechnen, können Sie php.net/manual/ru/function.iterator-count.php + counter innerhalb der Schleife verwenden. In Bezug auf die Komprimierungsstufe ist dies mit ZipArchive derzeit nicht möglich: stackoverflow.com/questions/1833168/…
Dador
54

In der ZipArchive-Klasse gibt es eine nützliche undokumentierte Methode: addGlob ();

$zipFile = "./testZip.zip";
$zipArchive = new ZipArchive();

if ($zipArchive->open($zipFile, (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== true)
    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/en/ziparchive.addglob.php

Mark Baker
quelle
2
@netcoder - die Vorteile des Schreibens des PHpt zum Testen ... Lesen Sie im Grunde die Quelle für die ZipArchive-Klasse durch und finden Sie sie dort. Es gibt auch eine undokumentierte addPattern () -Methode, die ein Regexp-Stilmuster verwendet. aber ich habe es nie geschafft, das zum Laufen zu bringen (kann ein Fehler in der Klasse sein)
Mark Baker
1
@kread - Sie können dies mit jeder Dateiliste verwenden, die mit glob () extrahiert werden kann. Daher habe ich es als äußerst nützlich empfunden, seit ich es entdeckt habe.
Mark Baker
@MarkBaker Ich weiß, dass dieser Kommentar Jahre nach dem Posten kommt. Ich versuche hier nur mein Glück. Ich habe hier auch eine Frage zum Zippen gestellt. Ich bin im Begriff, die Glob-Methode auszuprobieren, die Sie hier veröffentlicht haben, aber mein Hauptproblem ist, dass ich addFromString nicht verwenden kann und addFile verwendet habe, was nur stillschweigend fehlschlägt. Haben Sie vielleicht eine Idee, was falsch laufen könnte oder was ich falsch machen könnte?
Skytiger
@ user1032531 - die letzte Zeile meines Beitrags (bearbeitet am 13. Dezember 2013) zeigt genau das mit einem Link zur Dokumentenseite
Mark Baker
6
Ist addGlobrekursiv?
Vincent Poirier
20

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 komprimiert.

Netcoder
quelle
Es löscht sicher einige Dateien in My folder, aber ich habe auch einen Ordner in einem Ordner, My folderder mir den Fehler gibt: Berechtigung verweigert durch Aufheben der Verknüpfung des Ordners mit inMy folder
woninana
@ Stupefy: Versuchen Sie es if (!is_dir($file) && $file != 'target_folder...')stattdessen. Oder überprüfen Sie die Antwort von @kread, wenn Sie rekursiv komprimieren möchten. Dies ist der effizienteste Weg.
Netcoder
Der Ordner in der My folderwird immer noch nicht gelöscht, aber es gibt trotzdem keine Fehler mehr.
Woninana
Ich habe auch vergessen zu erwähnen, dass keine ZIP-Dateien erstellt wurden.
Woninana
1
Das Löschen der Dateien vor dem Aufruf $zip->close()funktioniert nicht. Überprüfen Sie meine Antwort hier
hek2mgl
19

Ich gehe davon aus, dass dies auf einem Server ausgeführt wird, auf dem sich die Zip-Anwendung im Suchpfad befindet. Sollte für alle Unix-basierten Server gelten und ich denke, die meisten Windows-basierten Server.

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.

Kevin Read
quelle
15

Ich habe es mit dem folgenden 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';
}
?>
Amir Md Amiruzzaman
quelle
Hervorragende Lösung. Es funktioniert auch in Laravel 5.5. hat mir sehr gut gefallen. (y)
Web Artisan
1
Toller Code! Sauber, einfach und perfekt funktionierend! ;) Es scheint mir die beste Antwort zu sein. Wenn es jemandem helfen kann: Ich habe gerade ini_set('memory_limit', '512M');vor der Ausführung des Skripts und ini_restore('memory_limit');am Ende hinzugefügt . Bei schweren Ordnern musste Speichermangel vermieden werden (es handelte sich um einen Ordner mit mehr als 500 MB).
Jacopo Pace
1
In meiner Umgebung (PHP 7.3, Debian) wurde ein ZIP-Archiv ohne Verzeichnisliste erstellt (große, leere Datei). Ich musste die folgende Zeile ändern: $ name. = '/'; in $ name = ($ name == '.'? '': $ name. '/');
Gerfried
Das funktioniert bei mir. Danke für das Teilen. Prost!
Sathiska
8

Dies ist eine Funktion, die einen ganzen Ordner und seinen Inhalt in eine Zip-Datei komprimiert. Sie können sie einfach so 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";
}
Alireza Fallah
quelle
Wie kann ich mit diesem Skript auch Unterordner automatisch in die Sicherung einbeziehen? @ Alireza
floCoder
2

Probieren Sie das EFS PhP-ZiP MultiVolume-Skript aus ... Ich habe Hunderte von Gigs und Millionen von Dateien komprimiert und übertragen ... ssh wird benötigt, um Archive effektiv zu erstellen.

Aber ich glaube, dass resultierende Dateien mit exec direkt von PHP verwendet werden können:

exec('zip -r backup-2013-03-30_0 . -i@backup-2013-03-30_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 sollte.

ByREV
quelle
1

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();
Sonnenliebe
quelle
1

Ich fand diesen Beitrag in Google als zweites Top-Ergebnis, zuerst wurde exec :( verwendet

Obwohl dies nicht genau meinen Bedürfnissen entsprach, beschloss ich, mit meiner schnellen, aber erweiterten Version eine Antwort für andere zu veröffentlichen.

SCRIPT-FUNKTIONEN

  • Benennung der Sicherungsdatei Tag für Tag, PREFIX-JJJJ-MM-TT-POSTFIX.EXTENSION
  • Dateiberichterstattung / fehlt
  • Vorherige Sicherungsliste
  • Zippt / schließt keine vorherigen Backups ein;)
  • Funktioniert unter Windows / Linux

Wie auch immer, auf das Skript. Auch wenn es viel aussieht. Denken Sie daran, dass hier ein Überschuss vorhanden ist. Sie können also die Berichtsabschnitte nach Bedarf löschen.

Es kann auch unordentlich aussehen und bestimmte Dinge können leicht bereinigt werden ... Also kommentieren Sie es nicht, es ist nur ein schnelles Skript mit grundlegenden Kommentaren. NICHT FÜR DEN LIVE-GEBRAUCH. Aber einfach für den Live-Gebrauch zu bereinigen !

In diesem Beispiel wird es aus einem Verzeichnis ausgeführt, das sich im Stammverzeichnis 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 der gesamte Inhalt der Variablen $ pathBase komprimiert und die Zip-Datei in demselben Ordner gespeichert. Es führt eine einfache Erkennung für frühere Sicherungen durch und überspringt diese.

CRON BACKUP

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

Wütend 84
quelle
Ich habe auch das Löschskript ausgeschlossen, Sie können die akzeptierte Antwort dafür sehen
Angry 84
Ich muss diese zufälligen Abstimmungen lieben, ohne dass ein Kommentar erklärt, warum.
Wütend 84
1

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');
Waqar Alamgir
quelle
1

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;
}
Indrajeet Singh
quelle
1

Erstellen Sie einen Zip-Ordner in PHP.

Zip-Erstellungsmethode

   public function zip_creation($source, $destination){
    $dir = opendir($source);
    $result = ($dir === false ? false : true);

    if ($result !== false) {

        
        $rootPath = realpath($source);
         
        // Initialize archive object
        $zip = new ZipArchive();
        $zipfilename = $destination.".zip";
        $zip->open($zipfilename, 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();
        
        return TRUE;
    } else {
        return FALSE;
    }


}

Rufen Sie die Zip-Methode auf

$source = $source_directory;
$destination = $destination_directory;
$zipcreation = $this->zip_creation($source, $destination);
Mamun Sabuj
quelle
0

Ich habe das Skript ein wenig 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();
    ?>
Poohspear
quelle
Dies komprimiert die Dateien, aber die Verzeichnisliste ist weg, es hat kein Verzeichnis mehr
Sujay sreedhar
0

Dadurch wird Ihr Problem behoben. 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();
Lakhan
quelle
0

Für alle, die diesen Beitrag lesen und nach einem Grund suchen, warum die Dateien mit addFile anstelle von addFromString komprimiert werden sollen, ohne die Dateien mit ihrem absoluten Pfad zu komprimieren (nur die Dateien komprimieren und sonst nichts), siehe meine Frage und Antwort hier

Skytiger
quelle