2010-10-02 7 views
0

Note: Je suis sur localhost, donc CHMOD n'est pas la solution.Copier les fichiers extraits du fichier ZIP vers le répertoire


Quoi qu'il en soit, je ne peux pas copier les fichiers qui ont été extraites d'un ZIP dans un répertoire, les fichiers sont extraits, mais ils ne seront pas copiés ... les fichiers pondent juste à la racine dossier où upload.php est. J'ai ceci:

exec('unzip ' . $_FILES['file']['tmp_name'], $ary, $output); 

$img = 0; 

$number = count($ary); 

foreach($ary as $file) 
{ 
    copy($file, 'i/'); 
    unlink($file); 
    $img++; 
} 

echo $img . '/' . $number; 

Il produit 11/11, donc ce bon ... mais les fichiers ne sont pas copiés et les fichiers d'origine ne sont pas supprimés. Pourquoi ne les copie-t-il pas?

Répondre

2

Le problème est que vous supposez que le tableau $ary contient les noms de fichiers. Mais ce n'est pas le cas.

$ary qui détiennent la sortie de la commande unzip sera quelque chose comme:

extracting: foo 
extracting: bar 
... 

vider le contenu Essayez de tableau à l'aide var_dump($ary) pour le confirmer.

Mon conseil serait de ne pas utiliser la commande unzip externe, au lieu d'utiliser build in zip functions of PHP comme:

$zip = new ZipArchive; 
if ($zip->open("$_FILES['file']['tmp_name']") === TRUE) { 
    $zip->extractTo('i/'); 
    $zip->close(); 
} else { 
    // failed to extract. 
} 
+0

+1 pour une bonne réponse, bien qu'il faille probablement noter que ZipArchive a été ajouté dans une révision ultérieure de PHP 4. Si vous êtes sur un ancien système, vous pouvez être forcé d'analyser la sortie d'une ligne shell exec() . – stevendesu

0

Comme déjà mentionné codaddict, essayez PECL module zip ou PEAR File_Archive. Mais si vous ne pouvez pas installer l'un de ceux, et coincé avec un vieux PHP, essayez:

exec('unzip ' . $_FILES['file']['tmp_name'] . ' | tail -n"+2" | cut -d" " -f4 ', $ary, $output); 

Cela devrait vous donner les noms de fichiers.

0

Il ne copie pas les fichiers beause vous ne l'avez pas lu le manuel entièrement:

$ dest - Le chemin de destination. Si $ dest est une URL, l'opération de copie peut échouer si l'encapsuleur ne prend pas en charge l'écrasement des fichiers existants. Avertissement: Si le fichier de destination existe déjà, il sera remplacé.

Vous devez spécifier le chemin de destination complet (y compris le nom de fichier), et pas seulement le répertoire.