2009-05-13 8 views
3

J'écris un script pour extraire les fichiers d'une archive zip dans le répertoire qui se trouve le script.Extrait répertoire à l'intérieur Zip

Voici mon code:

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

Cela fonctionne très bien, mais il y a un problème. Le zip contient un calque supplémentaire. (zip/répertoire/fichiers) qui extrait comme ce répertoire/fichiers plutôt que seulement les fichiers.

est-il un moyen d'enlever cette couche supplémentaire?

Merci pour votre aide!

Joel Drapper

+1

Soyez prudent lorsque vous permettant aux utilisateurs de télécharger zip fichiers que vous décompressez par la suite. Vous devenez vulnérable aux bombes zip: http://en.wikipedia.org/wiki/Zip_bomb –

Répondre

2

Afin d'éviter tous les fichiers d'obtenir écrasé, vous voulez probablement extraire le fichier zip dans un premier répertoire. Je crée un répertoire avec un nom aléatoire, extraire le zip dans ce directeur et vérifier tous les sous-répertoires:

<?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>/" 
} 

Je ne l'ai pas testé ce code, donc, utilisez à vos propres risques,, il a également peut ne pas fonctionner comme prévu sur les systèmes Windows. De plus, consultez la documentation de toutes les fonctions je:

+0

Merci pour votre aide! Je n'ai pas besoin de créer un autre répertoire car je sais que le répertoire dans lequel se trouve le script sera vide. Je veux juste extraire les fichiers depuis le zip (et le calque de répertoire aléatoire inutile) vers le même dossier que le script. –