2009-05-13 9 views
3

Ich schreibe ein Skript, um Dateien aus einem Zip-Archiv in das Verzeichnis zu extrahieren, in dem sich das Skript befindet.Verzeichnis in Zip extrahieren

Hier ist mein Code:

$zip = new ZipArchive; 
if ($zip->open('latest.zip') === TRUE) { 
    $zip->extractTo('.'); 
    $zip->close(); 
    unlink('installer.php'); 
    echo 'it works!'; 
} else { 
    echo 'failed'; 
} 

Dies funktioniert gut, aber es gibt ein Problem. Die Zip enthält eine zusätzliche Ebene. (zip/directory/files) das wie dieses Verzeichnis/Dateien extrahiert und nicht nur die Dateien.

Gibt es eine Möglichkeit, diese zusätzliche Schicht zu entfernen?

Danke für Ihre Hilfe!

Joel Drapper

+1

Vorsicht beim Benutzer erlaubt zip hochladen Dateien, die Sie anschließend entpacken. Sie werden anfällig für Zip-Bomben: http://en.wikipedia.org/wiki/Zip_bomb –

Antwort

2

Um aus alle Dateien zu verhindern überschrieben bekommen, möchten Sie wahrscheinlich zunächst die Zip-Datei in ein Verzeichnis extrahieren. Ich würde ein Verzeichnis mit einem zufälligen Namen erstellen, die Zip in diesem Regisseur extrahieren und dann für alle Unterverzeichnisse überprüfen:

<?php 

// Generate random unzip directory to prevent overwriting 
// This will generate something like "./unzip<RANDOM SEQUENCE>" 
$pathname = './unzip'.time().'/'; 

if (mkdir($pathname) === TRUE) { 

    $zip = new ZipArchive; 

    if ($zip->open('latest.zip') === TRUE) { 

    $zip->extractTo($pathname); 

    // Get subdirectories 
    $directories = glob($pathname.'*', GLOB_ONLYDIR); 

    if ($directories !== FALSE) { 

     foreach($directories as $directory) { 

     $dir_handle = opendir($directory); 

     while(($filename = readdir($dir_handle)) !== FALSE) { 

      // Move all subdirectory contents to "./unzip<RANDOM SEQUENCE>/" 
      if (rename($filename, $pathname.basename($filename)) === FALSE) { 
      print "Error moving file ($filename) \n"; 
      } 
     } 
     } 
    } 

    // Do whatever you like here, for example: 
    unlink($pathname.'installer.php'); 

    } 

    // Clean up your mess by deleting "./unzip<RANDOM SEQUENCE>/" 
} 

ich diesen Code nicht getestet haben, so, auf eigene Gefahr, auch, es funktioniert möglicherweise nicht wie vorgesehen auf Windows-Systemen. Zusätzlich wird für die Dokumentation überprüfen alle Funktionen verwendet I:

+0

Vielen Dank für Ihre Hilfe! Ich muss kein anderes Verzeichnis erstellen, da ich weiß, dass das Verzeichnis, in dem sich das Skript befindet, leer ist. Ich möchte nur die Dateien innerhalb der Zip (und die zufällige nutzlose Verzeichnisschicht) in den gleichen Ordner extrahieren, in dem sich das Skript befindet. –