2013-07-17 15 views
19

Nun, zunächst einmal, das ist meine Ordnerstruktur:alle Dateien im Verzeichnis ZIP und herunterladen .zip erzeugt

images/ 

image1.png 
image11.png 
image111.png 
image223.png 
generate_zip.php 

Und das ist mein generate_zip.php:

<?php 

    $files = array($listfiles); 

    $zipname = 'adcs.zip'; 
    $zip = new ZipArchive; 
    $zip->open($zipname, ZipArchive::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 

    header('Content-Type: application/zip'); 
    header("Content-Disposition: attachment; filename='adcs.zip'"); 
    header('Content-Length: ' . filesize($zipname)); 
    header("Location: adcs.zip"); 

    ?> 

Wie sammeln alle Dateien aus "images /" Ordner, außer "generate_zip.php", und machen Sie eine herunterladbare .zip? In diesem Fall hat der Ordner "images /" immer ein anderes Bild. Ist das möglich?

Antwort

19

dies wird eine Datei mit Endung .php sicherzustellen, werden nicht hinzugefügt:

foreach ($files as $file) { 
     if(!strstr($file,'.php')) $zip->addFile($file); 
    } 

edit: hier ist der vollständige Code neu geschrieben:

<?php 

    $zipname = 'adcs.zip'; 
    $zip = new ZipArchive; 
    $zip->open($zipname, ZipArchive::CREATE); 
    if ($handle = opendir('.')) { 
     while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != ".." && !strstr($entry,'.php')) { 
      $zip->addFile($entry); 
     } 
     } 
     closedir($handle); 
    } 

    $zip->close(); 

    header('Content-Type: application/zip'); 
    header("Content-Disposition: attachment; filename='adcs.zip'"); 
    header('Content-Length: ' . filesize($zipname)); 
    header("Location: adcs.zip"); 

    ?> 
+0

ok, aber wie aus den Bildern/Verzeichnis alle Dateien aufzulisten ? Inside-Array? –

+0

http://php.net/manual/en/function.readdir.php hat, was Sie in dieser Hinsicht brauchen, Beispiel # 2 ist wahrscheinlich am einfachsten. Sie könnten if ($ entry! = "." && $ entry! = "..") auf if ($ entry! = "." && $ entry! = ".." &&! strstr ($ entry, '. php ')) und fügen Sie auch die Zip-Schleife in diese Schleife statt meines obigen Beispiels ein. – skrilled

+0

Bereits versucht, aber wie das while-Ergebnis in das Array(); –

0

Änderung dies Ihr foreach-Schleife auszunehmen generate_zip.php

foreach ($files as $file) { 
    if($file != "generate_zip.php"){ 
     $zip->addFile($file); 
    } 
} 
1

Da Sie nur bestimmte Dateien aus einem Verzeichnis benötigen, um Z zu erstellen ipArchive können Sie dazu glob() Funktion verwenden.

<?php 
    $zip = new ZipArchive; 
    $download = 'download.zip'; 
    $zip->open($download, ZipArchive::CREATE); 
    foreach (glob("images/*.png") as $file) { /* Add appropriate path to read content of zip */ 
     $zip->addFile($file); 
    } 
    $zip->close(); 
    header('Content-Type: application/zip'); 
    header("Content-Disposition: attachment; filename = $download"); 
    header('Content-Length: ' . filesize($download)); 
    header("Location: $download"); 
?> 

Verwenden glob() nicht, wenn Sie versuchen, Dateien in einem Verzeichnis aufzulisten, wo sehr viel Dateien (mehr als 100.000) gespeichert sind. Sie erhalten einen Fehler "Erlaubte Speichergröße von XYZ Bytes erschöpft ...".

readdir() ist stabiler Weg. !

45

======= ====== Arbeitslösung

umfasst alle Unterordner:

<?php 
$the_folder = 'path/foldername'; 
$zip_file_name = 'archived_name.zip'; 

class FlxZipArchive extends ZipArchive { 
     /** Add a Dir with Files and Subdirs to the archive;;;;; @param string $location Real Location;;;; @param string $name Name in Archive;;; @author Nicolas Heimann;;;; @access private **/ 
    public function addDir($location, $name) { 
     $this->addEmptyDir($name); 
     $this->addDirDo($location, $name); 
    } // EO addDir; 

     /** Add Files & Dirs to archive;;;; @param string $location Real Location; @param string $name Name in Archive;;;;;; @author Nicolas Heimann * @access private **/ 
    private function addDirDo($location, $name) { 
     $name .= '/';   $location .= '/'; 
     // Read all Files in Dir 
     $dir = opendir ($location); 
     while ($file = readdir($dir)) { 
      if ($file == '.' || $file == '..') continue; 
      // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File(); 
      $do = (filetype($location . $file) == 'dir') ? 'addDir' : 'addFile'; 
      $this->$do($location . $file, $name . $file); 
     } 
    } 
} 

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

Wenn es die beste Lösung ist, ich weiß es nicht, aber ich habe es getan, weil das auch für mich funktioniert –

+1

Yeeeeeeeeeeeeeeeeeeeeeeees Man du bist GROSS !!!! +1 für Sie – Abadis

+0

Das ist eine gute Antwort, aber es basiert nicht auf der Frage, die OP stellte, in der er spezifizierte, dass er sich nur für die einzelnen Verzeichnisse Bilddateien interessierte.Nur gedacht, dass sollte geklärt werden, wie jeder, der genau das tut, was OP gefragt hat, würde diesen Code nicht genau das tun. – skrilled